我正在访问一个具有火车时刻表的 API,该 API 返回arrival_time
. 到达时间为24小时格式,即15:24:56
。
我可以将它们存储为 MySQL TIME
类型,也可以将它们存储为以秒为单位的整数(自午夜以来的秒数(。
但是,我遇到了一个问题:当我访问这些数据时,我想提取与当前时间相比的下一个火车时间。 所以让我们说当前日期/时间是2016-02-14 23:52:30
。由于接近午夜,它不会将01:20:30
识别为晚于当前时间。
我该如何处理这种情况? 我的第一个想法是从数据库中提取所有可能的Arrival Time
值,并在我的代码 (PHP( 中创建DateTime
对象,将这些时间放在今天的 Date 中。 然后,如果我达到"即将到来的时间"少于 X 数量的点,请采用相同的一组时间并添加一天并继续。
有没有更好的方法来解决这个问题?
以下是拉动"下一个"火车时间的一种方法:
select s.*
from schedules s
order by arrival_time > curtime() desc,
arrival_time
limit 1;
计算(稍后时间(-(较早时间(。 然后,如果您得到负数,请添加 24 小时。
mysql> SELECT @earlier := TIME_TO_SEC('23:52:30'), @later := TIME_TO_SEC('01:20:30');
+-------------------------------------+-----------------------------------+
| @earlier := TIME_TO_SEC('23:52:30') | @later := TIME_TO_SEC('01:20:30') |
+-------------------------------------+-----------------------------------+
| 85950 | 4830 |
+-------------------------------------+-----------------------------------+
mysql> SELECT @diff := @later - @earlier;
+----------------------------+
| @diff := @later - @earlier |
+----------------------------+
| -81120 |
+----------------------------+
mysql> SELECT @real_diff := IF(@diff < 0, @diff + 86400, @diff);
+---------------------------------------------------+
| @real_diff := IF(@diff < 0, @diff + 86400, @diff) |
+---------------------------------------------------+
| 5280 |
+---------------------------------------------------+
mysql> SELECT SEC_TO_TIME(@real_diff);
+-------------------------+
| SEC_TO_TIME(@real_diff) |
+-------------------------+
| 01:28:00 |
+-------------------------+
(当然,这可以/应该缩短以在您的代码中使用。