我想知道各种商店的营业时间,但我不知道什么是最好的储存方式。一个直观的解决方案是为每一天设置开始和结束时间。但这意味着每天两个属性,这看起来不太好。另一种方法是为每一天设置一个开始时间和day to second间隔。但是,这仍然意味着两个属性。什么是最常见和最简单的方法来表示这一点?我在和甲骨文合作。
day to second
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)
想想那些在某一天也根本不开门的商店,以及如何表示它们。也许你也可以做一个基于日期的覆盖,以表明在某些日期(圣诞节等)不同的(或没有)开放时间。这是一个很有趣的问题。
yhived7q2#
我曾经做过类似的事情,我使用了数字:
START_DATE END_DATE 0700 1800 0915 1745 0600 2300 1115 2215
它很容易使用普通的SQL,即。BETWEEN子句如果一家商店有一个休息?
gkn4icbw3#
我认为有两个列是完全有意义的,一个是开放日期时间,一个是关闭日期时间。因为一旦商店开张,总有一天/某个时候必须关闭。
建议
我会创建一个单独的表为商店开放/关闭时间。由于每次商店被打开,它将有一个关闭的时间值,以及,所以你不会有任何不必要的空在你的第二列。对我来说,有一个单独的表完全有意义的商店开放关闭时间。
ep6jt1vc4#
由于Oracle没有date only或time only数据类型,因此您将需要使用date数据类型,即date和time。你提到的直观解决方案在我看来很不错。
laik7k3q5#
您的需求有两个数据点:开放时间和关闭时间。有不同的方式来表示信息,但您需要两个属性。我理解为什么你认为有两个属性将导致“一个更长的条件来检查”是否“给定的时间在间隔内”。但是Oracle提供了许多方法来操作其DATE数据类型。更多信息.一个有用的掩码是'SSSSS',这是午夜过后的秒数。因此,如果您将打开和关闭时间保持为秒,则可以像这样检查间隔:
'SSSSS'
select * from shop where sysdate between trunc(sysdate) + (opening_time_sssss/86400) and trunc(sysdate) + (closing_time_sssss/86400)
我不是说它很优雅,但它很有效。实际上,可以将开放时间存储在单个属性中:通过将它们表示为RAW列中的位掩码。这将更难理解,甚至更不优雅的检查。
hgtggwj06#
迟到的聚会,但时间跨度将是好的
6条答案
按热度按时间inb24sb21#
您需要的最低粒度可能是分钟(实际上,可能是15分钟间隔,但称之为分钟)。
也许你还想考虑一周中的某一天。
如果使用表,例如:
在store_id和day_of_week上弹出一个唯一的约束,对于给定的商店和一周中的某一天,您可以通过以下方式找到营业时间:
或者...
24小时营业的商店可以用特殊的代码来表示,而不是营业时间,在一个单独的表中,而不是特殊的开放和关闭时间,或者你可以只保留开放/关闭时间为空。
想想那些在某一天也根本不开门的商店,以及如何表示它们。
也许你也可以做一个基于日期的覆盖,以表明在某些日期(圣诞节等)不同的(或没有)开放时间。
这是一个很有趣的问题。
yhived7q2#
我曾经做过类似的事情,我使用了数字:
它很容易使用普通的SQL,即。BETWEEN子句
如果一家商店有一个休息?
gkn4icbw3#
我认为有两个列是完全有意义的,一个是开放日期时间,一个是关闭日期时间。因为一旦商店开张,总有一天/某个时候必须关闭。
建议
我会创建一个单独的表为商店开放/关闭时间。由于每次商店被打开,它将有一个关闭的时间值,以及,所以你不会有任何不必要的空在你的第二列。对我来说,有一个单独的表完全有意义的商店开放关闭时间。
ep6jt1vc4#
由于Oracle没有date only或time only数据类型,因此您将需要使用date数据类型,即date和time。你提到的直观解决方案在我看来很不错。
laik7k3q5#
您的需求有两个数据点:开放时间和关闭时间。有不同的方式来表示信息,但您需要两个属性。
我理解为什么你认为有两个属性将导致“一个更长的条件来检查”是否“给定的时间在间隔内”。但是Oracle提供了许多方法来操作其DATE数据类型。更多信息.
一个有用的掩码是
'SSSSS'
,这是午夜过后的秒数。因此,如果您将打开和关闭时间保持为秒,则可以像这样检查间隔:我不是说它很优雅,但它很有效。
实际上,可以将开放时间存储在单个属性中:通过将它们表示为RAW列中的位掩码。这将更难理解,甚至更不优雅的检查。
hgtggwj06#
迟到的聚会,但时间跨度将是好的