oracle 数据库中的开放时间使用什么数据类型

i7uaboj4  于 2023-10-16  发布在  Oracle
关注(0)|答案(6)|浏览(123)

我想知道各种商店的营业时间,但我不知道什么是最好的储存方式。
一个直观的解决方案是为每一天设置开始和结束时间。但这意味着每天两个属性,这看起来不太好。
另一种方法是为每一天设置一个开始时间和day to second间隔。但是,这仍然意味着两个属性。
什么是最常见和最简单的方法来表示这一点?我在和甲骨文合作。

inb24sb2

inb24sb21#

您需要的最低粒度可能是分钟(实际上,可能是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)

想想那些在某一天也根本不开门的商店,以及如何表示它们。
也许你也可以做一个基于日期的覆盖,以表明在某些日期(圣诞节等)不同的(或没有)开放时间。
这是一个很有趣的问题。

yhived7q

yhived7q2#

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

START_DATE  END_DATE
0700        1800
0915        1745
0600        2300
1115        2215

它很容易使用普通的SQL,即。BETWEEN子句
如果一家商店有一个休息?

gkn4icbw

gkn4icbw3#

我认为有两个列是完全有意义的,一个是开放日期时间,一个是关闭日期时间。因为一旦商店开张,总有一天/某个时候必须关闭。

建议

我会创建一个单独的表为商店开放/关闭时间。由于每次商店被打开,它将有一个关闭的时间值,以及,所以你不会有任何不必要的空在你的第二列。对我来说,有一个单独的表完全有意义的商店开放关闭时间。

ep6jt1vc

ep6jt1vc4#

由于Oracle没有date only或time only数据类型,因此您将需要使用date数据类型,即date和time。你提到的直观解决方案在我看来很不错。

laik7k3q

laik7k3q5#

您的需求有两个数据点:开放时间和关闭时间。有不同的方式来表示信息,但您需要两个属性。
我理解为什么你认为有两个属性将导致“一个更长的条件来检查”是否“给定的时间在间隔内”。但是Oracle提供了许多方法来操作其DATE数据类型。更多信息.
一个有用的掩码是'SSSSS',这是午夜过后的秒数。因此,如果您将打开和关闭时间保持为秒,则可以像这样检查间隔:

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

我不是说它很优雅,但它很有效。
实际上,可以将开放时间存储在单个属性中:通过将它们表示为RAW列中的位掩码。这将更难理解,甚至更不优雅的检查。

hgtggwj0

hgtggwj06#

迟到的聚会,但时间跨度将是好的

相关问题