【问题标题】:Design Hours of Operation SQL Table设计营业时间 SQL 表
【发布时间】:2011-11-08 01:47:57
【问题描述】:

我正在设计一个 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.

你会如何设计桌子?

编辑

小时数将用于显示商店是否在用户选择的时间营业。

不同的表可能可以处理任何异常,例如假期。

每周营业时间不会改变。

【问题讨论】:

    标签: sql database-design data-modeling


    【解决方案1】:

    这样的表格对于您发布的输出和返回(打开?是/否)都很容易:

    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...(您显然想格式化 Open/Close)

    要查询 IsOpen?,只需:

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

    【讨论】:

      【解决方案2】:

      更多地把它想象成定义时间框架,天/周更复杂,因为它们有规则和定义的开始和停止。

      您如何定义时间范围?

      一个约束(开始[时间和日期])一个参考“持续时间”(小时,分钟,.. 的跨度)*。现在,班次(时间范围)可以跨越数天,您不必使用复杂的逻辑来提取和使用计算中的数据。

      **Store_Hours**
      
      Store | Day | Open | DURATION
      ---------------------------
      1     | 1   | 0000 | 24
      1     | 2   | 0730 | 7
      1     | 2   | 1615 | 6.75
      ... 
      1     | 3   | 1900 | 5.5
      

      【讨论】:

      • 我也在考虑持续时间,但确定商店是否在周一凌晨 1:00 营业可能会更困难。我们需要检查星期天和星期一
      • SELECT CASE WHEN @desiredtime BETWEEN Open AND DateAdd(hh, duration,Open)THEN 1 ELSE 0 END FROM table WHERE store = @Store 不难?
      • 语句稍微复杂一些。我们也需要这一天,因此我们需要检查所需的日期和前一天,以防持续时间延长到今天。因此,如果我们检查 day =1,我们还需要检查 day=7 是否存在 open + duration >24 的情况。
      • 无论哪种情况,您的 goig 都需要这样做。但是如果你不使用持续时间。你打算如何区分周三/周四和周日/周一?一个实例是轮班继续,另一个是轮班结束,另一个开始。
      【解决方案3】:

      您需要做的不仅仅是存储和展示吗?

      我认为需要判断商店是否在特定时间营业的设计必须了解所有可能性,否则,您最终将无法容纳某些东西。

      假期例外情况如何?

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

      所以 0 是星期一的午夜。

      区间 1 为 0 - 1440

      区间 2 为 1890 - 2310

      等等

      您可以轻松地将用户选择的时间转换为分钟偏移量,并确定商店是否营业。

      剩下的唯一问题是为了友好显示而在显示中解释(可能是一些广泛的逻辑,但并非不可能)并在时间 10080 -> 0 重叠。

      【讨论】:

      • 我们会将假期异常存储在不同的表中。
      • 我们将使用小时来查看商店是否在用户选择的时间营业,因此它不仅仅是为了在屏幕上显示。
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-24
      • 2021-10-05
      相关资源
      最近更新 更多