我有一个数据库表,以 TIME 格式存储商店的营业时间作为时间范围。例如,如果商店的营业时间是“上午 9 点至下午 5 点”,则将有 2 列“hours_open”和“hours_close”,我将 9:00 存储在“hours_open”中,将 17:00 存储在“hours_close”中。要确定商店当前是开门还是关门,我将运行查询:
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) )
That way the query might be like this:
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
,即 shop
表,那么过滤条件很可能必须更复杂,可能是这样的:
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
关于php - 在MySQL中存储时间范围并判断当前时间是否在时间范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237898/