我有一个数据库表存储商店的营业时间作为TIME格式的时间范围.例如,如果商店的营业时间是’上午9点至下午5点’,那么将有2列’hours_open’和’hours_close’,我在’hours_open’中存储9:00,在’hours_close’中存储17:00.要确定商店当前是打开还是关闭,我将运行查询:
SELECT *
FROM shop
WHERE CAST(Now() AS TIME) BETWEEN hours_open AND hours_close;
我现在需要做的是容纳营业时间超过午夜的商店,如晚上9点至凌晨3点.此外,商店在不同的日子可以有不同的开放时间,例如:周一至周四:晚上9点至凌晨3点,周五至周日:晚上9点至凌晨5点.
现在我很难过.我该怎么办?我每天可以有一对’hours_open’和’hours_close’,例如:’mon_hours_open’,’mon_hours_close’,’tue_hours_open’,’tue_hours_close’……
但是如何处理午夜过夜时间的开放时间,如下午9点至凌晨5点?
任何见解?如果有帮助,我正在使用PHP和Codeigniter框架.
解决方法:
如果它们存储在一个单独的表中,就会更容易检查小时数
shop_working_hours ( shop_id int FK, day_of_week int, hours_open time, hours close time, PK (shop_id, day_of_week) )
这样查询可能是这样的:
SELECT s.*
FROM shop s
INNER JOIN shop_working_hours h ON s.id = h.shop_id
WHERE
CASE
WHEN h.hours_close > h.hours_open THEN
h.day_of_week = DAYOFWEEK(Now()) AND
CAST(Now() AS time) >= h.hours_open AND CAST(Now() AS time) < h.hours_close
ELSE
h.day_of_week = DAYOFWEEK(Now() - 1) AND
CAST(Now() AS time) >= h.hours_open OR CAST(Now() AS time) < h.hours_close
END
但是,如果您宁愿坚持在同一个表中的每周的每一天都有多个列,例如* _hours_open和* _hours_close,即商店表,那么过滤条件很可能必须更复杂,可能是这样的:
SELECT s.*
FROM shop s
CROSS JOIN (
SELECT 1 AS day_of_week
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
UNION ALL SELECT 6
UNION ALL SELECT 7
) h
WHERE
CASE h.day_of_week
WHEN 1 THEN
CASE
WHEN s.mon_hours_close > s.mon_hours_open THEN
h.day_of_week = DAYOFWEEK(Now()) AND
CAST(Now() AS time) >= s.mon_hours_open AND
CAST(Now() AS time) < s.mon_hours_close
ELSE
h.day_of_week = DAYOFWEEK(Now() - INTERVAL 1 DAY) AND
CAST(Now() AS time) >= s.mon_hours_open OR
CAST(Now() AS time) < s.mon_hours_close
END
WHEN 2 THEN
CASE
WHEN s.tue_hours_close > s.tue_hours_open THEN
… /* same for Tuesday */
END
… /* and for all the other days of week */
END