我在stackoverflow上看到了一些关于如何设计数据库表来存储营业时间的例子,但它们并没有满足我的所有需求。他们不支持根据一年中的周期来定义不同的小时数,也不支持假期和一年中的特殊时间可以关闭。
一般来说,商店#1将有这些营业时间
在12月份,开放时间不同
他们在这些日期关闭:
由于某些原因,他们有特殊情况,开放时间可能不同:
StoreId BeginDate EndDate DayOfWeek OpenHour Duration
1 2015-01-01 2015-11-30 2 09:00 180
1 2015-01-01 2015-11-30 2 13:00 240
1 2015-01-01 2015-11-30 3 09:00 180
1 2015-01-01 2015-11-30 3 13:00 240
...
1 2015-12-01 2015-12-31 2 09:00 180
1 2015-12-01 2015-12-31 2 13:00 480
1 2015-12-01 2015-12-31 3 09:00 180
1 2015-12-01 2015-12-31 3 13:00 480
...
答案 0 :(得分:0)
答案 1 :(得分:0)
不要再考虑规则了。想想行。
如果您只是存放营业时间,这很简单。 PostgreSQL对这类事情有特别好的支持。
create table business_hours (
open tstzrange primary key,
exclude using gist (open with &&)
);
exclusion constraint保证不会重叠开放时间。如果它每天需要两行,那么一年的数据就会超过700行。 100年的数据只有70k行。这是大多数灵活选项,开发和测试时间几乎为零,最低工资职员可以验证您要宣传的营业时间是否与您打开的时间相匹配。
正常时间
-- The "normal" hours for the week starting Apr 13, 2015 (a Monday).
insert into business_hours values
-- Mon
(tstzrange('2015-04-13 09:00', '2015-04-13 12:00')),
(tstzrange('2015-04-13 13:00', '2015-04-13 17:00')),
-- Tue
(tstzrange('2015-04-14 09:00', '2015-04-14 12:00')),
(tstzrange('2015-04-14 13:00', '2015-04-14 17:00')),
-- Wed
(tstzrange('2015-04-15 09:00', '2015-04-15 12:00')),
(tstzrange('2015-04-15 13:00', '2015-04-15 17:00')),
-- Thu
(tstzrange('2015-04-16 09:00', '2015-04-16 12:00')),
(tstzrange('2015-04-16 13:00', '2015-04-16 21:00')),
-- Fri
(tstzrange('2015-04-17 09:00', '2015-04-17 12:00')),
(tstzrange('2015-04-17 13:00', '2015-04-17 21:00')),
-- Sat
(tstzrange('2015-04-18 10:00', '2015-04-18 17:00'));
-- Sun
-- Closed.
从插入“正常”时间应该可以清楚地看出,这种表格可以容纳任何类型的逻辑,无论好坏。
您可以将这种语句包装在存储的函数中,以便您可以一次生成一周,一个月或一年的“正常”小时。根据需要更新。
在其他dbms中,您可以使用两个时间戳列和一些检查约束。检查重叠行可能必须作为异常报告而不是作为dbms强制执行的约束来完成。
create table business_hours (
opens timestamp not null,
closes timestamp not null,
check (closes > opens),
primary key (opens, closes)
);
使用这对列作为主键,优化器可以使用仅索引扫描。
答案 2 :(得分:0)
我正在处理同样的问题,到目前为止,我已经为您设计了类似的方法。但是关于你的问题。
null