MySQL开放时间

时间:2014-12-03 18:12:47

标签: mysql

我正在尝试找出查询以下营业时间的最有效方法:

+---------+----------+----------+-----------+
| openDay | openTime | closeDay | closeTime |
+---------+----------+----------+-----------+
|       0 | 1800     |        1 |  400      |
|       1 | 1800     |        2 |  400      |
|       2 | 1800     |        3 |  400      |
|       3 | 1800     |        4 |  400      |
|       4 | 1800     |        5 |  400      |
|       5 | 1800     |        6 |  400      |
|       6 | 1800     |        0 |  400      |
+---------+----------+----------+-----------+

给出一周中的一天(0 ... 6)我想确定一个地方当前是否开放。如果所有地方在同一天打开和关闭,我可以简单地运行以下内容:

SELECT COUNT(*) 
FROM opening_hrs
WHERE (100*HOUR(NOW())+MINUTE(NOW()) >= openTime) 
AND (100*HOUR(NOW())+MINUTE(NOW()) <= closeTime)
AND openDay = 1

但是,如果使用openDay = 1,则技术上从0-400和1800-2400开放。如何更改查询以考虑这些多个时段?

表格式是一个生产表,因此更改格式在这种特定情况下不起作用(尽管可以缓解问题)。

2 个答案:

答案 0 :(得分:1)

如果您无法修改表格,则可以使用此查询:

SELECT COUNT(*) 
FROM opening_hrs
WHERE (((100*HOUR(NOW())+MINUTE(NOW()) >= openTime) 
        AND (100*HOUR(NOW())+MINUTE(NOW()) <= closeTime + 2400*(closeDay-openDay)))
       OR 
       ((100*HOUR(NOW())+MINUTE(NOW()) >= openTime - 2400*(closeDay-openDay)) 
        AND (100*HOUR(NOW())+MINUTE(NOW()) <= closeTime )))
AND openDay = 1

如果您可以将表格修改为如下所示:

+---------+----------+-----------+
|     day | openTime | closeTime |
+---------+----------+-----------+
|       0 | 1800     |  2400     |
|       1 | 1800     |  2400     |
|       2 | 1800     |  2400     |
|       3 | 1800     |  2400     |
|       4 | 1800     |  2400     |
|       5 | 1800     |  2400     |
|       6 | 1800     |  2400     |
|       0 |    0     |   400     |
|       1 |    0     |   400     |
|       2 |    0     |   400     |
|       3 |    0     |   400     |
|       4 |    0     |   400     |
|       5 |    0     |   400     |
|       6 |    0     |   400     |
+---------+----------+-----------+

然后您可以执行以下查询:

SELECT COUNT(*) 
FROM opening_hrs
WHERE (100*HOUR(NOW())+MINUTE(NOW()) >= openTime) 
AND (100*HOUR(NOW())+MINUTE(NOW()) <= closeTime)
AND day = 1

请注意,没有更多的openDay和closeDay;只是一个day列。 另请注意,openTime始终小于closeTime,因此查询中的不等式可以正常工作。

答案 1 :(得分:0)

在测试结束时间时,您可以与

进行比较
AND (100*HOUR(NOW())+MINUTE(NOW()) < closeTime + 2400*(closeDay - openDay))

以上将把0400小时视为2800,这在数字上大于今天的任何时间

要测试0000-0400期间,你可以查看当前时间是否超出了前一天跨越日界的开放时间,如

OR (100*HOUR(NOW())+MINUTE(NOW()) <
        (SELECT MIN(closeTime) FROM opening_hrs
          WHERE closeDay = 1 AND openTime > closeTime)
)

编辑:如果&gt; vs&gt; =无关紧要,您可以将范围测试合并为一个(hours00+minutes) between openTime and closeTime