我想跟踪各个商店的营业时间,但我不知道存储它的最佳方式是什么。
一个直观的解决方案是每天都有开始和结束时间。但这意味着每天有两个属性,这看起来不太好。
另一种方法是每天都有一个开始时间和一个
day to second
间隔。但这仍然意味着两个属性。
最常见和最简单的表示方法是什么?我正在与甲骨文合作。
您需要的最低粒度可能是分钟(实际上,可能是 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)
考虑一下在某一天根本不开门的商店,以及如何表示这一点。
也许您也可以使用基于日期的覆盖来指示某些日期(圣诞节等)的不同(或没有)开放时间。
这是一个非常有趣的问题。
我曾经做过类似的事情,并且使用了数字:
START_DATE END_DATE
0700 1800
0915 1745
0600 2300
1115 2215
使用普通 SQL(即 BETWEEN 子句)很容易。
如果商店休息怎么办?
我认为有两列,第一列用于打开日期时间,一列用于关闭日期时间,这是完全有意义的。因为商店一旦开业,总有一天/某个时候必须关门。
我的建议
我会为商店开门/关门时间创建一个单独的表。由于每次打开商店时,它也会有一个关闭时间值,因此第二列中不会有任何不需要的空值。对我来说,有一个单独的表格来记录商店的营业时间和关闭时间是完全有意义的。
由于 Oracle 没有仅日期或仅时间数据类型,因此您将需要使用既是日期又是时间的日期数据类型。您提到的直观解决方案对我来说看起来相当不错。
您的要求有两个数据点:开放时间和关闭时间。表示信息的方式有多种,但您需要两个属性。
我理解为什么您认为拥有两个属性会导致“更长的条件来检查”“给定时间是否在间隔内”。但是 Oracle 提供了很多方法来操纵它 日期数据类型。 了解更多。
一个有用的掩码是
'SSSSS'
,它是午夜过后的秒数。因此,如果您将打开和关闭时间保持为秒,您可以像这样检查间隔:
select * from shop
where sysdate between trunc(sysdate) + (opening_time_sssss/86400)
and trunc(sysdate) + (closing_time_sssss/86400)
我并不是说它很优雅,但它很有效。
实际上,可以将开放时间存储在单个属性中:通过将它们表示为 RAW 列中的位掩码。这会更难理解,检查起来更不优雅。
聚会迟到,但时间跨度会很好