web-dev-qa-db-ja.com

商人がpostgresで開いている時間を保存する

Postgresでは、商人が毎週開いている時間を保存する必要があります。基本的に、販売者のドアの看板に表示される情報は次のとおりです。

Mondays: Closed
Tuesday-Friday: 9am-1pm, 2pm-6pm
Weekends: 10am-2pm

これまでのいくつかのアイデア:

  1. 1週間を30分(または5分)のチャンクに分割し、ビットストリングタイプを使用して、そのチャンク中に商人が開いているかどうかを保存します。
  2. 2次元配列タイプ、配列「日」を使用します。各「日」と、店舗が開いていたときの時間範囲の配列です。

おそらく関連するのは、データがどのように使用されるかです。

  1. 販売者の詳細ページで、上記の店の看板のように、すべての販売者の時間をユーザーに表示します。
  2. ストアが現在開いているかどうかを示します。
  3. 店舗が次に開くまでの時間を示します。
  4. おそらく他のことも...

このデータをpostgresで表現する方法についてのアドバイスを探しています。

8
Jonah

最も単純なストレージは次のとおりです。

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フィールドの代わりに日付フィールドが必要になる可能性のある特別な日(通常は休日に関連する)を考慮する必要があります。その場合は、上記のストレージから営業時間を構築した後で、このデータを必ず適用してください。

5
Adam Zuckerman

私は同じ問題があったファーストフード店のシフトを解決するためのシステムをプログラムしました。

タイムゾーンと夏時間という最も難しい問題を見逃していると思います。

情報を出力するだけの場合は、「timezone without timezone」のデータタイプで問題ありませんが、営業時間などの計算ではEdgeのケースに注意する必要があります。

時間と分を整数として格納することに頼りました。これにより、「印刷可能な時間」が明確に示されましたが、日付時刻関数の誤用は防止されました。

このような計算が必要な場合は、まず、関連する日付の関連するタイムゾーンでUTCに変換し直しました。

また、「日」内の複数の開閉を考慮する必要がある場合もあります。完全に正規化された構造には、次のものが必要です。

[Store]
Id
Timezone

[Day]
Id
StartDate
StoreId

[OpenPeriod]
DayId
OpenHour
OpenMinute
CloseHour
CloseMinute

注:(私はもっと覚えています)「日」は24時間より長くなることがあります

時間は「時計が言う時間」であり、真夜中以降の時間ではありません

1
Ewan

データを一連の開始時刻と終了時刻として保存します。各期間には複数のエントリを含めることができます。期間は、「期間」が希望するもの、または定義された日である文字列として設定できます。

コードでは、重複するデータを入力しないようにする必要がありますが、このシステムからの読み取りは非常に簡単です。

テーブル

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)
0
Jacobm001