2011-09-01 49 views
6

我正在设计一个SQL表来存储商店的几个小时的操作。设计运行时间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. 

您将如何设计表格?

EDIT

将用于表示如果存储是在一个用户选择的时间打开的小时。

不同的表格可能会处理任何例外情况,例如假期。

商店的营业时间不会每周都改变。

回答

6

像这样的表很容易同时为输出您发布,以及刚刚解雇了一下腰(开放是/否):

Store | Day | Open | Closed 
--------------------------- 
1  | 1 | 0000 | 2400 
1  | 2 | 0730 | 1430 
1  | 2 | 1615 | 2300 
... 

特点:

  1. 使用24小时是没有必要的,但使数学更容易。
  2. 商店ID大概会加入到您存储的查找表中商店信息
  3. 日ID将转换为星期几(1 =星期日,2 =星期一等))

要查询的数据集,只是: SELECT Day, Open, Close...(你要格式化打开/关闭明显)

要查询ISOPEN?刚:

SELECT CASE WHEN @desiredtime BETWEEN Open AND Closed THEN 1 ELSE 0 END 
FROM table 
WHERE store = @Store 
2

你需要做的不仅仅是存储和显示它吗?

我认为一个需要告诉商店是否在特定时间开放的设计必须通过所有可能性来告知,否则您最终将无法容纳某些东西。

假期例外情况如何?

我会考虑将它们存储为基于基准时间的间隔(从一周0时起的分钟数)。

所以0是周一午夜。

间隔1将是0 - 1440

间隔2将一八九○年至2310年

你可以容易地在用户选择的时间转换成一个微小的偏移并确定是否存储了打开。

剩余的将是显示口译友好的显示(可能是一些丰富的逻辑,但不是不可能)和重叠的时候你唯一的问题10080 - > 0

+0

我们会将假期例外存储在不同的表中。 – Emil

+0

我们将使用小时来查看商店是否在用户选择的时间打开,因此它不仅仅用于在屏幕上显示。 – Emil

+1

@Emil看到编辑的概念。 –

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 
+0

我也在考虑持续时间,但要确定一家商店是否在周一凌晨1点营业,可能会更困难。我们需要检查周日和周一 – Emil

+0

'SELECT CASE WHEN @desiredtime BETWEEN Open AND DateAdd(hh,duration,Open)THEN 1 ELSE 0 END FROM WHERE store = @ Store'不难吗? –

+0

该声明稍微复杂一点。我们也需要一天的时间,所以我们需要检查所需日期和前一天,以防止持续时间到今天。因此,如果我们检查day = 1,我们还需要检查day = 7是否存在open + duration> 24时的情况。 – Emil