考虑下面的SQL查询:存储时间 - 使用时间或Int字段? (PHP和MySQL数据库)
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类型。
我正在使用MySQL。
假设open_time是“18:00”,close_time是“02:00”,当前时间是“22:41”。我们有一个关于close_time的单独数据库记录(因为它在午夜之后),但我们永远不会在结果中得到它,因为close_time“02:00”不会比当前时间“22:41”更大。
此外,如果当前时间为“01:00”,我们将获取NEXT日值,因为周日不匹配。
解决方案?
您是否愿意将这些值存储为整数(分钟),这样php就可以直接处理这些值,而无需任何转换?
例如...
当前时间:
$timearr = explode(':',date("w:H:i"));
$currenttime = ($timearr[0]) * 1440 + $timearr[1] * 60 + $timearr[2]
的当前时间极小值= 0(太阳,00:00),最大值为10079(星期六,23:59)
在数据库中,存储的打开/关闭时间值可以是和之间0 11519(星期六,47:59)
现在假设,当前时间是“太阳,01:00”(第一天周),执行上面的涵盖这个值是60; (星期六)的最后一天的开启/关闭时间被设置为存储在DB中的“17:00”和“02:00”(实际上是星期天),作为9660和10200(星期六,26:00) 。在这种情况下,上述查询将找不到我们需要的记录(星期六,17:00,02:00),因为我们可能没有小于“02:00”(120)的open_time。为了解决这个问题,我们将“Sun,01:00”转换为“Sat,25:00”,在$ currenttime中添加7 * 1440(整周),这将导致10140.然后DB查询如下:
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);
或者什么是替代和整洁的解决方案?
我有一个问题:你想存储每一天的开放和关闭时间,如一年365/366,或只是周一到周日的类型? –
Just Mon to Sun –
然后使用@AlienWebGuy建议的整数表示法。 '周日10点'或'42230'为'71000','周四晚上10点30分'。您并不需要日期/时间类型字段。 –