2

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

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

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

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

4

5 回答 5

3

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

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

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

很有趣的问题,这个。

于 2013-11-11T10:35:38.177 回答
2

我做过一次类似的事情,我使用了 NUMBERs:

START_DATE  END_DATE
0700        1800
0915        1745
0600        2300
1115        2215

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

如果商店休息怎么办?

于 2013-11-11T09:59:01.023 回答
1

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

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

于 2013-11-10T20:45:36.053 回答
0

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

我理解为什么您认为拥有两个属性会导致“检查时间更长”是否“给定时间在间隔内”。但是 Oracle 提供了许多方法来操作其 DATE 数据类型。 了解更多

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

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

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


实际上,可以将营业时间存储在单个属性中:通过将它们表示为 RAW 列中的位掩码。这将更难理解,甚至更难以检查。

于 2013-11-11T07:55:32.273 回答
0

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

于 2013-11-10T20:38:58.630 回答