2011-11-25 55 views
2

考虑下面的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); 

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

+0

我有一个问题:你想存储每一天的开放和关闭时间,如一年365/366,或只是周一到周日的类型? –

+0

Just Mon to Sun –

+1

然后使用@AlienWebGuy建议的整数表示法。 '周日10点'或'42230'为'71000','周四晚上10点30分'。您并不需要日期/时间类型字段。 –

回答

1

使用INT因为不是所有的数据库都支持DATE字段,或者以相同的方式支持它们。 INT更便于携带,并且如果您选择使用该路线,则可以使用整数时间戳来计算日期。

+0

我正在使用mySQL服务器。它支持时间和日期。我的问题是我应该使用INT还是Time类型来解决问题。 –

+0

我甚至不会使用'Time'类型。整数。我甚至从DBA听说为了进一步的便携性而使用'INT'或'TINYINT'作为1/0字段而不是'BOOL',但这完全是另一个讨论:) – AlienWebguy

+0

mysql是正确的标记。我使用mySQL –

7

我已经从经验中学习,总是存储它们的内容并适当地使用数据类型,所以我会推荐时间或日期时间选项。当你开始做任何事情时,最好把它放在正确的格式中,然后将它转换为显示,排序等。

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

如果您需要移动它,即将其导出到另一个数据库或格式,您将使用一个工具(即使只是一个SQL脚本),将有能力将其转换为另一种格式或类型。

+0

我其实也很喜欢这个答案。我有时希望我没有在特定领域使用unix时间戳,并且可以使用本地日期/时间比较和其他数据库功能。简而言之,我使用时间戳,因为我对它们更加舒适,并不是因为它们是该领域的正确方法。 –

+0

@Michael如果我要使用TIME类型字段 - 如果关闭时间是午夜之后如何解决问题?请再次阅读我的问题,谢谢 –

+0

@ user791022 - MySQL ['TIME'](http://dev.mysql.com/doc/refman/5.0/en/time.html)类型允许您进入'838: 59:59',所以你可以在'2 am'上做'26:00:00',你只需要在PHP代码中处理它。 –

相关问题