MySQL - 存储时间和日期比较


MySQL - Storing Times and Comparison with Dates

我正在访问一个具有火车时刻表的 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                |
+-------------------------+

(当然,这可以/应该缩短以在您的代码中使用。