MySQL - 存储时间和日期比较

时间:2016-02-15 00:07:27

标签: php mysql database-design

我正在访问具有列车时刻表的API,该时间表返回arrival_time。到达时间为24小时格式,即15:24:56

我可以将它们存储为MySQL TIME类型,或者我可以在几秒钟内(从午夜起几秒钟)将它们存储为整数。

但是,我遇到了一个问题:当我访问这些数据时,我想拉下下一班列车时间与当前时间相比。所以我们说当前的日期/时间是2016-02-14 23:52:30。由于它接近午夜,它不会将01:20:30识别为晚于当前时间。

我该如何处理这种情况?我的第一个想法是从数据库中提取所有可能的Arrival Time值,并在我的代码(PHP)中创建DateTime个对象,将这些时间放在今天的日期中。然后,如果我达到“即将到来的时间”少于X量的点,请采取相同的一组时间并向他们添加一天并继续。

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

这是拉动“下一次”列车时间的一种方法:

select s.*
from schedules s
order by arrival_time > curtime() desc,
         arrival_time
limit 1;

答案 1 :(得分:0)

计算(以后的时间) - (早些时候)。然后,如果您得到负数,请添加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                |
+-------------------------+

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