【问题标题】:SQL for Opening Hours营业时间的 SQL
【发布时间】:2011-02-12 20:57:06
【问题描述】:

在我的商店数据库中,我需要知道营业时间。你知道如何在我的分贝中实现这一点吗?

营业时间为周一至周日,每天可有2个开窗时间(例如09:00-12:00、16:00-19:00)

【问题讨论】:

    标签: sql database schema


    【解决方案1】:

    建立另一个表,命名为schedules,在shops表的主键中添加一个外键,一个Day of week字段,time_open,time_closed。 数据应如下所示:

    shop_id     day_of_week      time_open        time_closed
    1           1                09:00            12:00
    1           1                16:00            19:00
    1           2                09:00            12:00
    1           2                16:00            19:00
    1           3                09:00            12:00
    1           3                16:00            19:00
    1           6                10:00            14:00
    2           1                09:00            12:00
    2           1                13:00            18:00
    

    这将使您有机会构建任何类型的时间表,其中包含任意数量的窗口,以及您需要的例外数量。它是通用的,仅限于它期望所有周都相同的事实。不考虑假期,也不考虑某人可能使用的奇数/偶数周时间表。

    编辑:
    对于 Julien 的问题,关于夜店的工作时间,我注意到之前的解决方案并不是最好的。您不能让柱线在 20:00 打开,在 06:00 关闭,然后比较当前时间 (02:45) 是否在此时间间隔内,因为它不会。因此,以方便的计量单位(例如分钟)记录总工作时间而不是关闭时间是最方便的。

    shop_id     day_of_week      time_open        working_time
    1           1                09:00            180
    1           1                16:00            180
    1           2                09:00            180
    1           2                16:00            180
    1           3                09:00            180
    1           3                16:00            180
    1           6                10:00            240
    2           1                09:00            180
    2           1                13:00            300
    

    【讨论】:

    • 这将允许您为给定日期添加第三个时间表,如果这违反了您的规则,您需要严格控制新时间表的添加以检查...或您可以添加一个“sched_num”列,其中包含一个检查约束,它是 0 或 1,并且在 day_of_week 和 sched_num 上有一个唯一约束。
    • 这是处理夜店营业时间的更好方法,例如酒吧,营业时间为晚上 10:00 到凌晨 04:00。添加两个条目(第 1 天:22:00->23:59 和第 2 天:00:00->04:00)?或一个条目(第1天:22:00->04:00)?
    • 有趣的问题。在这种情况下,重新制造这种情况是最合理的。请参阅编辑后的回复。
    • 我认为在这种情况下,我只会以十进制小时记录时间,并允许一天超过 24 小时。所以,周六,酒吧可能会在 22:00 到 28:00(第二天凌晨 4 点)营业。例如。但这真的取决于我将支持数据库的用例。
    • 我在想...对于第二个打开/关闭窗口,为什么不再添加两列...所以打开/关闭总共 4 列...open_a、close_a、open_b、close_b。 ...只是一个想法
    【解决方案2】:

    您使用的是什么类型的数据库?如果是mysql,请输入“时间”类型的字段。然后你可以传递它的时间并对它们进行基本的 sql 时间操作。整篇文章都假设 mysql。

    如果只有一家商店并且您知道它永远不会增长,只需​​制作一张名为 times 的表格,您可以在其中记录商店的营业时间。然后,如果您想查看商店是否营业,只需对照数据库中的某个范围检查当前时间即可。

    如果有多个商店,则制作一个名为“times”的表和一个名为“stores”的表。在时间表中,列可以是“open”和“close”,id 称为“store_id”。商店表也需要一个 id。然后,你可以说:

    "SELECT open, close FROM times WHERE store_id=x"
    

    这将为您提供与特定商店相关的所有时间范围。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2015-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2015-04-11
      • 1970-01-01
      • 2014-05-31
      相关资源
      最近更新 更多