我正在设计一个SQL表来存储商店的营业时间。
有些商店的营业时间非常简单:周一至周日上午9:30至晚上10:00
其他人则更为复杂。请考虑以下情况:
Monday: Open All Day
Tuesday: 7:30AM – 2:30PM & 4:15PM – 11:00 PM
Wednesday: 7:00PM – 12:30 AM (technically closing on Thursday morning)
Thursday: 9:00AM – 6:00PM
Friday: closed.
你会如何设计表格?
修改
小时将用于显示商店是否在用户选择的时间打开。
另一个表可以处理任何异常,例如假期。
商店营业时间不会每周都有所变化。
答案 0 :(得分:6)
这样的表对于你发布的输出都很容易,而且只是稍微开一点(打开?是/否):
Store | Day | Open | Closed
---------------------------
1 | 1 | 0000 | 2400
1 | 2 | 0730 | 1430
1 | 2 | 1615 | 2300
...
特点:
要查询您的数据集,只需:
SELECT Day, Open, Close...
(你想要明确地打开/关闭格式)
要查询IsOpen?,只需:
SELECT CASE WHEN @desiredtime BETWEEN Open AND Closed THEN 1 ELSE 0 END
FROM table
WHERE store = @Store
答案 1 :(得分:3)
更多地考虑定义时间框架,日/周更复杂,因为它们有规则并定义了开始和停止。
您如何定义时间范围?
一个约束(开始[时间和日期]), 一个参考 '持续时间' (小时,分钟,......的跨度) *。现在,班次(时间范围)可以跨越多天,您无需使用复杂的逻辑来提取和使用计算中的数据。
**Store_Hours**
Store | Day | Open | DURATION
---------------------------
1 | 1 | 0000 | 24
1 | 2 | 0730 | 7
1 | 2 | 1615 | 6.75
...
1 | 3 | 1900 | 5.5
答案 2 :(得分:2)
您需要做的不仅仅是存储和展示吗?
我认为需要判断商店是否在特定时间开放的设计必须以所有可能性为依据,否则,您最终将无法容纳某些商品。
假期例外呢?
我会考虑根据基准时间(从一周的0时开始的分钟数)将它们存储为间隔。
所以0是星期一午夜。
间隔1为0 - 1440
间隔2将是1890 - 2310
等
您可以轻松地将用户选择的时间转换为分钟偏移量,并确定商店是否已打开。
剩下的唯一问题是显示友好显示的解释(可能是一些广泛的逻辑,但并非不可能),并且在时间10080重叠 - > 0