php - MySQL:在选择查询中操作日期和字符串

标签 php mysql string date datetime

我的 MySQL 表中有两列:EventStart 和 Distance。 EventStart 是一个 DateTime,表示事件开始的时间,但 Distance 是一个字符串,它将到事件的英里数和到达那里的时间组合在一起,例如“126.2 英里/2 小时 35 分钟”。

我想根据我需要离开事件的时间来打印表的内容,这意味着我将从 EventStart 中减去距离值的右半部分(“/”标记之后的所有内容)。我想按出发时间对结果进行排序,因此当我迭代结果时,我只需打印它们即可。

在 PHP 中这相当简单:

$distance = substr($row['Distance'], strrpos( $row['Distance'],'/')+1);
$result = date('j M - g:i a', strtotime($row['EventStart']." -".$distance));

但是,如果我有一个事件于 10 点开始,距 1 小时还有 1 小时,还有一个事件于 11 点开始,距 3 小时后,使用 MySQL ORDER BY EventStart 事件将显示为9 号出发时间列在 8 号出发时间之前,这显然是不正确的。

由于可能有数百个条目,我想避免创建 2D PHP 数组并对其进行排序,因此我希望直接在 MySQL 查询中执行此操作。我认为这使它成为一个由两部分组成的问题:

  1. 如何仅选择“/”标记之后的所有内容进行距离计算?
  2. 如何从 EventStart 中减去该值,以便可以根据计算出的距离进行排序?

最后一点:我知道以这种方式存储距离是错误的;我正在从别人那里接过这个项目。

感谢您的帮助!

最佳答案

嗯,这有点有趣。我希望您首先找到创建此架构的人,并向他们展示他们应得的爱。

像这样的东西应该可以工作。我认为,我已将其拆分为子查询,以使每个步骤更具可读性。

SELECT miles, hours + minutes FROM (
SELECT
  cast(left(Distance, first_space) AS DECIMAL(5,2)) AS miles,
  cast(substr(Distance, distance_split_loc+1, hour_loc-distance_split_loc-1) AS unsigned) * 60 AS hours,
  cast(IF (hour_loc = 0,
    substr(Distance, distance_split_loc+1, min_loc-distance_split_loc-1),
    substr(Distance, space_after_hour, min_loc-space_after_hour)) AS unsigned) AS minutes
FROM
(SELECT
   Distance,
   locate(' ', Distance) first_space,
   locate('/', Distance) distance_split_loc,
   locate('hour', Distance) AS hour_loc,
   locate('min', Distance) AS min_loc,
   locate(' ',Distance,locate('hour', Distance)) AS space_after_hour
 FROM distance) AS temp_table) AS timecalc
ORDER BY miles;

Link to SQLFiddle

关于php - MySQL:在选择查询中操作日期和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175501/

相关文章:

带有可选参数的php mysql函数

php - 在具有唯一列的数据库中插入时,可以使用 try/catch 而不是检查重复项吗?

java - 将字符串转换为 Uri

c# - 检查字符串的第一个元素是否为正整数

java - 将字符串乘以 double

php - 在php foreach循环中获取$_POST名称和值以构建长字符串

php - MySql中的上一条记录

mysql - 在 Mac OS X Yosemite 上安装 MySQL 并创建数据库

c# - 数据网格不更新

mysql:后缀搜索的有效方法(如 '%text' 又名前缀通配符)?