Postgresでは、商人が毎週開いている時間を保存する必要があります。基本的に、販売者のドアの看板に表示される情報は次のとおりです。
Mondays: Closed
Tuesday-Friday: 9am-1pm, 2pm-6pm
Weekends: 10am-2pm
これまでのいくつかのアイデア:
おそらく関連するのは、データがどのように使用されるかです。
このデータをpostgresで表現する方法についてのアドバイスを探しています。
最も単純なストレージは次のとおりです。
StoreID integer (foreign key)
DayOfTheWeek integer (range 0-6)
OpenTime time
CloseTime time
ValidFrom date (starting date when this record is in use)
ValidThru date (ending date when this record is in use, NULL for no ending date)
上記のフィールドはすべて必須です(NOT NULL
)。 ValidThru
は、レコードをオープンエンドとしてマークする方法に応じて、NULL
になります。
ある時点で、DayOfTheWeek
フィールドの代わりに日付フィールドが必要になる可能性のある特別な日(通常は休日に関連する)を考慮する必要があります。その場合は、上記のストレージから営業時間を構築した後で、このデータを必ず適用してください。
私は同じ問題があったファーストフード店のシフトを解決するためのシステムをプログラムしました。
タイムゾーンと夏時間という最も難しい問題を見逃していると思います。
情報を出力するだけの場合は、「timezone without timezone」のデータタイプで問題ありませんが、営業時間などの計算ではEdgeのケースに注意する必要があります。
時間と分を整数として格納することに頼りました。これにより、「印刷可能な時間」が明確に示されましたが、日付時刻関数の誤用は防止されました。
このような計算が必要な場合は、まず、関連する日付の関連するタイムゾーンでUTCに変換し直しました。
また、「日」内の複数の開閉を考慮する必要がある場合もあります。完全に正規化された構造には、次のものが必要です。
[Store]
Id
Timezone
[Day]
Id
StartDate
StoreId
[OpenPeriod]
DayId
OpenHour
OpenMinute
CloseHour
CloseMinute
注:(私はもっと覚えています)「日」は24時間より長くなることがあります
時間は「時計が言う時間」であり、真夜中以降の時間ではありません
データを一連の開始時刻と終了時刻として保存します。各期間には複数のエントリを含めることができます。期間は、「期間」が希望するもの、または定義された日である文字列として設定できます。
コードでは、重複するデータを入力しないようにする必要がありますが、このシステムからの読み取りは非常に簡単です。
テーブル:
field name | field type
------------------------------------------------
period | string (ex: Monday, T/TH, Weekends)
start time | time (ex: 01am; 02:30pm)
end time | time (ex: 01am; 02:30pm)