![](/img/trans.png)
[英]Storing dates and times in UTC and converting them local time in PHP/MySQL
[英]Storing times - use Time or Int field? (PHP & mySQL Database)
考虑下面的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类型。
我正在使用MySQL。
假设open_time是“18:00”,close_time是“02:00”,当前时间是“22:41”。 我们为close_time有一个单独的DB记录(因为它在午夜之后),但我们永远不会在结果中得到它,因为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; 并且周(星期六)的最后一天的开/关时间设置为“17:00”和“02:00”(实际上是星期日),存储在DB中为9660和10200(星期六,26:00) 。 在这种情况下,上面的查询将找不到我们需要的记录(星期六,17:00,02:00),因为我们可能没有任何open_time小于“02:00”(120)。 为了解决这个问题,我们将“Sun,01:00”转换为“星期六,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);
或者什么是替代和更整洁的解决方案?
我从经验中学到了总是存储它们的东西并适当地使用数据类型所以我建议使用时间或日期时间选项。 当你开始用它做任何其他事情时,最好以正确的格式使用它,然后将其投射以进行显示,排序等。
我知道的所有SQL数据库都支持日期/日期/时间/时间格式,当然是mysql。
如果您需要移动它,即将其导出到另一个数据库或格式,您将使用一个工具(即使只是一个sql脚本),它将能够将其转换为另一种格式或类型。
使用INT
因为并非所有数据库都支持DATE
字段,或者以相同的方式支持它们。 INT
更便携,如果您选择走这条路线,就可以很容易地用整数时间戳计算出你的日期。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.