我的 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 查询中执行此操作。我认为这使它成为一个由两部分组成的问题:
- 如何仅选择“/”标记之后的所有内容进行距离计算?
- 如何从 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;
关于php - MySQL:在选择查询中操作日期和字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17175501/