2011-09-01 10 views
6

私は、店舗の営業時間を格納するSQLテーブルを設計しています。設計時間SQLテーブル

一部の店舗では、非常に単純な時間を持っている:月曜日〜日曜日9:30 AMから10:00 PM

その他はもう少し複雑です。以下のシナリオを検討してください:

Monday: Open All Day 
Tuesday: 7:30AM – 2:30PM & 4:15PM – 11:00 PM 
Wednesday: 7:00PM – 12:30 AM (technically closing on Thursday morning) 
Thursday: 9:00AM – 6:00PM 
Friday: closed. 

どのようにテーブルを設計しますか?

EDIT

ストアは、ユーザ選択時に開いている場合を示すために使用される時間。

休暇などの例外は、別のテーブルで処理される可能性があります。

店舗の営業時間は週ごとに変わりません。

答えて

6

このようなテーブルは、出力の両方のために簡単だろうあなただけ(?オープンはい/いいえ)バックビットを発射するだけでなく、投稿:

Store | Day | Open | Closed 
--------------------------- 
1  | 1 | 0000 | 2400 
1  | 2 | 0730 | 1430 
1  | 2 | 1615 | 2300 
... 

特徴:24時間の使い方

  1. が必要ではないが、数学が容易になります。
  2. 店舗IDはおそらくストアしたルックアップテーブルに参加します。
  3. 日IDは曜日(1 =日曜日、2 =月曜日など)に変換されます。)

、データセットのためだけに照会するには:のIsOpenを照会するには SELECT Day, Open, Close...(あなたは明らかにオープン/クローズをフォーマットしたいと思います)

を?,ちょうど:それの

SELECT CASE WHEN @desiredtime BETWEEN Open AND Closed THEN 1 ELSE 0 END 
FROM table 
WHERE store = @Store 
2

保存して表示するだけではありませんか?

特定の時間に店舗が開いているかどうかを知る必要があるデザインには、すべての可能性によって通知する必要があります。そうしないと、何かを受け入れることができなくなります。

休暇の例外はどうですか?

私はそれらを基本時間(1週間の時間0からの分)に基づいて間隔として保存することを検討します。

0は月曜の深夜です。

区間1であろう0から1440

インターバル2となる1890年から2310年

簡単にオフセット分にユーザ選択された時間を変換し、ストアがあったかどうかを決定することができ開いた。

時に優しいディスプレイの表示で通訳(おそらくいくつかの大規模なロジックが、不可能ではない)との重複になり、残りのあなたの唯一の問題10080 - > 0

+0

休日の例外を別のテーブルに保存します。 – Emil

+0

時間を使って、選択した時間に店舗が開いているかどうかを確認します。 – Emil

+1

@Emil編集コンセプトを参照してください。 –

3

考えます時間枠を定義するときには、規則と定義された開始と終了が定義されているため、日/週はより複雑です。

タイムフレームをどのように定義しますか?

つの制約(スタート[日時])1参照 '期間'(スパンの時間、分、...) *。シフト(時間枠)は複数の日に及ぶ可能性があり、計算でデータを抽出して使用するために複雑なロジックを操作する必要はありません。

**Store_Hours** 

Store | Day | Open | DURATION 
--------------------------- 
1  | 1 | 0000 | 24 
1  | 2 | 0730 | 7 
1  | 2 | 1615 | 6.75 
... 
1  | 3 | 1900 | 5.5 
+0

また、期間も検討していましたが、月曜日午前1時に店舗が開かれているかどうかを判断するのは難しいかもしれません。私たちは日曜日と月曜日をチェックする必要があります。 – Emil

+0

'SELECT case When @ wheniredtime between open and DateAdd(hh、duration、Open)THEN 1 ELSE 0 ENDテーブルのWHERE store = @ Store' –

+0

ステートメントは少し複雑です。その日が必要なので、今日に入っている場合は、希望の日と前日の両方をチェックする必要があります。したがって、day = 1であることを確認する場合は、day + 7にopen + duration> 24の場合もあるかどうかを確認する必要があります。 – Emil