Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
存储时间-使用时间还是整数字段?(PHP和mySQL数据库)_Php_Mysql_Sql_Datetime - Fatal编程技术网

存储时间-使用时间还是整数字段?(PHP和mySQL数据库)

存储时间-使用时间还是整数字段?(PHP和mySQL数据库),php,mysql,sql,datetime,Php,Mysql,Sql,Datetime,考虑下面的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') 当前时间的最小值=0(太阳,00:00),最大值为10079(周六,23:5

考虑下面的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')
当前时间的最小值=0(太阳,00:00),最大值为10079(周六,23:59)

在数据库中,存储的打开/关闭时间值可能介于0和11519之间(Sat,47:59)

现在假设当前时间为“Sun,01:00”(一周的第一天),执行上述转换该值为60;每周最后一天(星期六)的打开/关闭时间设置为“17:00”和“02:00”(实际上是星期日),存储在DB中,分别为9660和10200(星期六,26:00)。在这种情况下,上面的查询将找不到我们需要的记录(Sat,17:00,02:00),因为我们可能没有任何小于“02:00”(120)的打开时间。为了解决这个问题,我们将“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);
从打开时间中选择打开时间、关闭时间
其中(打开时间=$currenttime)
或(打开时间=$currenttime+10080);

或者什么是替代和更整洁的解决方案?

使用
INT
,因为并非所有数据库都支持
DATE
字段,或者以相同的方式支持它们
INT
更具可移植性,如果您选择使用整数时间戳,也可以很容易地计算出日期。

我从经验中了解到,要始终按内容存储内容,并适当使用数据类型,因此我建议使用时间或日期时间选项。当您开始使用它做任何其他事情时,最好使用正确的格式,并将其转换为显示、排序等

我知道的所有SQL数据库都支持日期/日期/时间/时间格式,当然是mysql


如果您需要将其移动,即导出到另一个db或格式,您将使用一个能够将其转换为另一种格式或类型的工具(即使只是sql脚本)。

我使用的是mySQL Server。它支持时间和日期。我的问题是我的解决方案应该使用INT还是Time类型。我甚至不会使用
Time
类型。只包含整数。我甚至从DBA那里听说,为了进一步提高可移植性,使用
INT
TINYINT
作为1/0字段,而不是
BOOL
,但这完全是另一个讨论:)任何没有时态数据类型的数据库都只是一个玩具,不应该使用。@NullUserException:因为Michael Durant的答案“我从经验中学到,总是按照事物的本来面目来存储它们,并适当地使用数据类型……”是绝对正确的,尽管在对这个答案的评论中,他说“是的,作为一名dba,我会选择int。“我有一个问题:您是想存储每天的打开和关闭时间,比如一年365/366次,还是只存储周一到周日类型?然后使用@AlienWebGuy建议的整数表示法。类似于周日上午10点的
71000
或周四晚上10:30的
42230
。您实际上不需要日期/时间类型字段。thx对于建议,我想知道时间类型的用途是什么?让我抓狂的是,将分钟值存储为INT看起来非常混乱:)好吧,你知道我得到了它,PHP中的
time()
感到困惑,认为它就像一个时间戳,而不仅仅是格式化的时间。很抱歉。我仍然想说,你可以同样轻松地使用integer方法,这取决于你是否想将值转换回“人类可读”的格式。它也不是DB厂商特有的,这可能是一个因素,也可能不是。我实际上也喜欢这个答案。有时我希望我没有在特定字段中使用unix时间戳,可以使用本机日期/时间比较和其他数据库功能。简单地说,我使用时间戳是因为我对它们更熟悉,而不是因为它们是该字段的正确方法。@Michael如果我使用时间类型字段-如果关闭时间在午夜之后,如何解决问题?再读一遍我的问题,thanks@user791022-MySQL类型允许您在一个值中上升到
838:59:59
,因此您可以在
2 am
中执行
26:00:00
,您只需在PHP代码中处理它即可。+1回答非常好,我完全同意,我认为这是最佳实践。我已经做了大约5年的开发人员,我和你们一样,认识到数据类型的存在是有原因的。@Mario你们需要跳出你们的泡沫去思考。通常情况下,软件拥有专有的数据类型或对象属性,这会造成可移植性问题。如果不考虑可移植性,那么当然要充分利用可用的功能。
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);