你如何在PHP/MySQL中处理时间和午夜之后的情况?
使用INT
存储分钟数还是使用TIME
类型字段?
考虑以下SQL查询:
SELECT * FROM opening_hours
WHERE week_day = WEEKDAY(NOW()) + 1
AND open_hour =< date_format(now(),'%H:%i')
AND close_hour >= date_format(now(),'%H:%i')
open_hour
/ close_hour
字段是 TIME
类型的字段。
假设开门时间为 "18:00",关门时间为 "02:00",当前时间为 "22:41"。我们有一条单独的数据库记录用于关闭时间(因为它在午夜后),但我们永远不会在结果中得到它,因为关闭时间 "02:00" 不大于当前时间 "22:41"。
此外,如果当前时间为 "01:00",我们将得到下一天的值,因为星期几不匹配。
那么解决方案是什么呢?
您更愿意将这些值存储为 INT
(分钟),以便 PHP 能够直接处理这些值,而无需进行任何转换吗?
例如...
当前时间:
// w = Day of the week, H = 24-hour format, i = Minutes
$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
在数据库中,存储了以分钟为单位的开放/关闭时间值。
现在假设当前时间是“周日01:00”(一周的第一天),执行上述转换后,该值为60;而上个星期的开放/关闭时间(星期六)设置为“17:00”和“02:00”(实际上是星期日),存储在数据库中的值为9660和10200(星期六,26:00)。在这种情况下,上述查询将找不到我们需要的记录(星期六,17:00,02:00),因为我们可能没有任何开放时间小于“02:00”(120)。为了解决这个问题,我们将“星期日01:00”转换为“星期六25:00”,通过将7*1440(整个星期)添加到$currenttime中,结果为10140。然后进行如下数据库查询:
SELECT open_time,clos_time FROM open_hours
WHERE (open_time <= $currenttime
AND close_time >= $currenttime)
OR (open_time <= $currenttime +10080
AND close_time >= $currenttime + 10080);
还有什么替代方案更加简洁吗?