2

いろいろなお店の営業時間を把握したいのですが、どのように保存すればよいかわかりません。

直感的な解決策は、毎日の開始時刻と終了時刻を設定することです。しかし、それは 1 日あたり 2 つの属性を意味し、見栄えがよくありません。

もう 1 つのアプローチは、day to second毎日の開始時刻と間隔を設定することです。それでも、それは 2 つの属性を意味します。

これを表す最も一般的で簡単な方法は何ですか? 私はオラクルで働いています。

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 時間営業のショップは、開店時間の代わりに特別なコードを使用したり、特別な開店時間と閉店時間の代わりに別のテーブルで表すことができます。または、開店時間と閉店時間を null のままにしておくこともできます。

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

私は一度似たようなことをして、NUMBERを使用しました:

START_DATE  END_DATE
0700        1800
0915        1745
0600        2300
1115        2215

単純な SQL、つまり BETWEEN 句を使用するのは簡単でした。

お店が休みになったら?

于 2013-11-11T09:59:01.023 に答える
1

Open DateTime 用の列 1 と Close Datetime 用の 1 つの列を 2 つ用意するのは理にかなっていると思います。お店は一度開いたら、いつか/いつか閉じなければなりません。

私の提案
は、ショップの開店/閉店時間用に別のテーブルを作成することです。ショップが開店するたびに閉店時間の値も含まれるため、2 番目の列に不要な null が含まれることはありません。私にとって、店の開店時間と閉店時間のために完全に別のテーブルを用意することは完全に理にかなっています.

于 2013-11-10T20:45:36.053 に答える
0

要件には、開始時間と終了時間の 2 つのデータ ポイントがあります。情報を表す方法はいくつかありますが、2 つの属性が必要になります。

属性が 2 つあると、「特定の時間が間隔内にあるかどうかを確認する条件が長くなる」と考える理由がわかりました。しかし、Oracle は DATE データ型を操作する多くの方法を提供しています。 詳細をご覧ください

便利なマスクの 1 つ'SSSSS'に があります。これは、午前 0 時からの秒数です。したがって、開閉時間を秒単位で保持すると、次のように間隔を確認できます。

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

エレガントとは言えませんが、効果的です。


実際には、営業時間を 1 つの属性に格納することもできます。それは、営業時間を RAW 列のビット マスクとして表すことです。それは理解するのが難しく、チェックするのがさらにエレガントではありません。

于 2013-11-11T07:55:32.273 に答える
0

Oracleには日付のみまたは時間のみのデータ型がないため、日付と時間の両方である日付データ型を使用する必要があります。あなたが言及した直感的な解決策は、私にはかなり良さそうです。

于 2013-11-10T20:38:58.630 に答える