我想跟踪各个商店的营业时间,但我无法弄清楚最好的存储方式是什么。
直观的解决方案是每天都有开始和结束时间。但这意味着每天有两个属性,看起来不太好。
另一种方法是每天有一个开始时间和day to second
间隔。但是,这仍然意味着两个属性。
最常见,最简单的方法是什么?我正在使用oracle。
答案 0 :(得分:2)
我做了类似的事情,我使用了NUMBERs:
START_DATE END_DATE
0700 1800
0915 1745
0600 2300
1115 2215
使用普通SQL很容易,即使用BETWEEN子句。
如果商店有休息怎么办?
答案 1 :(得分:2)
您需要的最低粒度可能是几分钟(实际上,可能是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)
考虑在特定的日子里根本不打开的商店,以及如何表示。
也可以使用基于日期的覆盖来表示某些日期(圣诞节等)的不同(或没有)开放时间。
这是一个非常有趣的问题。
答案 2 :(得分:1)
我认为将两个第一列用于开放日期时间和一个用于关闭日期时间是完全合理的。因为一旦商店开放,它将不得不在某一天/某个时间关闭。
我的建议
我会为商店开放/关闭时间创建一个单独的表。由于每次打开一个商店,它都会有一个接近的时间值,所以你在第二列中不会有任何不需要的空值。对我来说,完全有意义的是为开店时间关闭一个单独的桌子。
答案 3 :(得分:0)
由于oracle没有仅限日期或仅限时间的数据类型,因此您需要使用日期数据类型,即日期和时间。您提到的直观解决方案对我来说非常好。
答案 4 :(得分:0)
您的要求有两个数据点:开放时间和结束时间。有不同的方式来表示信息,但您需要两个属性。
我理解为什么你认为有两个属性会导致“更长的条件来检查”是否“给定的时间在间隔内”。但Oracle提供了很多方法来操纵它 DATE数据类型。 Find out more
一个有用的面具是'SSSSS'
,这是午夜过后的秒数。因此,如果您将开启和关闭时间保持为秒,则可以检查以下间隔:
select * from shop
where sysdate between trunc(sysdate) + (opening_time_sssss/86400)
and trunc(sysdate) + (closing_time_sssss/86400)
我并不是说它很优雅,但它很有效。
实际上,可以将开放时间存储在单个属性中:将它们表示为RAW列中的位掩码。这将更难理解,甚至不那么优雅。