我正在尝试找出查询以下营业时间的最有效方法:
+---------+----------+----------+-----------+
| 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开放。如何更改查询以考虑这些多个时段?
表格式是一个生产表,因此更改格式在这种特定情况下不起作用(尽管可以缓解问题)。
答案 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