【问题标题】:What data type to use for opening hours in a database数据库中的营业时间使用什么数据类型
【发布时间】:2013-11-22 13:47:16
【问题描述】:

我想跟踪各种商店的营业时间,但我不知道什么是最好的存储方式。

一个直观的解决方案是为每一天设置开始时间和结束时间。但这意味着每天有两个属性,看起来不太好。

另一种方法是每天都有一个开始时间和一个day to second 间隔。但是,这仍然意味着两个属性。

最常用和最简单的表示方法是什么?我正在使用 oracle。

【问题讨论】:

  • 为什么你认为有两个记录不同信息的属性看起来不好看?这不是最明显的做法吗?
  • @jpw 是对的,但您也可以使用 BigInt 之类的东西来存储高字节和低字节的开头和结尾,就像在过去的甜蜜时光中一样:) 顺便说一句,数据库是什么?
  • @jim 那些日子啊?
  • 作为一个选项 - 从 00:00 开始和结束的分钟数。
  • 好的,好的。我只是希望有一种方法可以轻松地存储这些信息,然后检查给定时间是否在间隔内。如何检查是否需要更长的条件^^

标签: sql oracle time intervals


【解决方案1】:

由于 oracle 没有仅日期或仅时间数据类型,您将需要使用日期数据类型,即日期和时间。您提到的直观解决方案对我来说看起来不错。

【讨论】:

    【解决方案2】:

    我认为有两个第一列用于打开日期时间和一个用于关闭日期时间是完全有意义的。因为一旦商店开张,它就必须在某天/某个时候关闭。

    我的建议
    我会为商店开/关时间创建一个单独的表。由于每次打开商店时,它都会有一个关闭时间值,因此第二列中不会有任何不需要的空值。对我来说,完全有一个单独的表格来记录商店的营业关闭时间。

    【讨论】:

      【解决方案3】:

      您的要求有两个数据点:打开时间和关闭时间。有不同的方式来表示信息,但您需要两个属性。

      我理解您为什么认为拥有两个属性会导致“检查时间更长”是否“给定时间在间隔内”。但是甲骨文提供了许多方法来操纵它的 日期数据类型。 Find out more.

      一个有用的掩码是'SSSSS',它是午夜过后的秒数。因此,如果您将打开和关闭时间保持为秒,您可以像这样检查间隔:

      select * from shop
      where sysdate between trunc(sysdate) + (opening_time_sssss/86400) 
                    and trunc(sysdate) + (closing_time_sssss/86400)
      

      我并不是说它很优雅,但它很有效。


      实际上,可以将营业时间存储在一个属性中:通过将它们表示为 RAW 列中的位掩码。这将更难理解,而且检查起来更不优雅。

      【讨论】:

        【解决方案4】:

        我曾经做过类似的事情,我使用了 NUMBERs:

        START_DATE  END_DATE
        0700        1800
        0915        1745
        0600        2300
        1115        2215
        

        它很容易与普通 SQL 一起使用,即带有 BETWEEN 子句。

        如果商店休息了怎么办?

        【讨论】:

          【解决方案5】:

          您需要的最低粒度可能是分钟(实际上,可能是 15 分钟的间隔,但称之为分钟)。

          您可能还想考虑星期几。

          如果你使用的表格如:

          create table day_of_week_opening_hours(
            id                            integer primary key,
            day_of_week                   integer not null,
            store_id                      integer not null,
            opening_minutes_past_midnight integer default 0 not null,
            closing_minutes_past_midnight integer default (24*60) not null)
          

          对 store_id 和 day_of_week 设置唯一约束,对于给定的商店和星期几,您可以通过以下方式找到营业时间:

          the_date + (opening_minutes_past_midnight * interval '1 minute')
          

          或者...

          the_date + (opening_minutes_past_midnight / (24*60))
          

          一天 24 小时营业的商店可以用特殊代码而不是营业时间来表示,在单独的表格中而不是特殊的营业时间和关闭时间来表示,或者您可以将营业时间/关闭时间留空。

          create table day_of_week_24_hour_opening(
            id                            integer primary key,
            day_of_week                   integer not null,
            store_id                      integer not null)
          

          想想在某一天根本不营业的商店,以及如何表示它。

          也许您也可以使用基于日期的覆盖来指示某些日期(圣诞节等)的不同(或没有)营业时间。

          这是一个非常有趣的问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-09
            • 1970-01-01
            • 2012-09-16
            • 2011-05-19
            • 2021-03-05
            • 2011-01-18
            • 2011-03-07
            • 2017-03-26
            相关资源
            最近更新 更多