いろいろなお店の営業時間を把握したいのですが、どのように保存すればよいかわかりません。
直感的な解決策は、毎日の開始時刻と終了時刻を設定することです。しかし、それは 1 日あたり 2 つの属性を意味し、見栄えがよくありません。
もう 1 つのアプローチは、day to second
毎日の開始時刻と間隔を設定することです。それでも、それは 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 時間営業のショップは、開店時間の代わりに特別なコードを使用したり、特別な開店時間と閉店時間の代わりに別のテーブルで表すことができます。または、開店時間と閉店時間を null のままにしておくこともできます。
create table day_of_week_24_hour_opening(
id integer primary key,
day_of_week integer not null,
store_id integer not null)
まったく開いていない日も考えて、それをどう表現するか。
おそらく、日付ベースのオーバーライドを使用して、特定の日付 (クリスマスなど) に異なる (またはない) 営業時間を示すこともできます。
なかなか面白い問題ですね、これ。
私は一度似たようなことをして、NUMBERを使用しました:
START_DATE END_DATE
0700 1800
0915 1745
0600 2300
1115 2215
単純な SQL、つまり BETWEEN 句を使用するのは簡単でした。
お店が休みになったら?
Open DateTime 用の列 1 と Close Datetime 用の 1 つの列を 2 つ用意するのは理にかなっていると思います。お店は一度開いたら、いつか/いつか閉じなければなりません。
私の提案
は、ショップの開店/閉店時間用に別のテーブルを作成することです。ショップが開店するたびに閉店時間の値も含まれるため、2 番目の列に不要な null が含まれることはありません。私にとって、店の開店時間と閉店時間のために完全に別のテーブルを用意することは完全に理にかなっています.
要件には、開始時間と終了時間の 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 列のビット マスクとして表すことです。それは理解するのが難しく、チェックするのがさらにエレガントではありません。
Oracleには日付のみまたは時間のみのデータ型がないため、日付と時間の両方である日付データ型を使用する必要があります。あなたが言及した直感的な解決策は、私にはかなり良さそうです。