元の質問は、SQL を使用して ActiveRecord (RoR) アプリケーションの特定の営業時間範囲を満たすレコードをクエリする方法を示しています。クエリは複雑な条件を使用して、現在の時点と保存された値を比較します。この問題では、時刻値を何らかの日付型に変換し、PostgreSQL に比較を処理させることでこれが可能かどうかという疑問が生じます。
この問題を解決するには、PostgreSQL の tsrange (時間範囲) データ型を使用して営業時間を保存することをお勧めします。 tsrange を使用すると、期間として表現された営業時間を保存できます。PostgreSQL には、これらの範囲を操作するための組み込み関数と演算子が用意されています。
これを行うには、既存のテーブルにスキーマを変更する必要があります:
ALTER TABLE hours_of_operations ALTER COLUMN opens_on TYPE TIMESTAMP ALTER COLUMN closes_on TYPE TIMESTAMP ALTER COLUMN opens_at TYPE TIME ALTER COLUMN closes_at TYPE TIME
tsrange 値を保存するための新しい列を作成します:
ALTER TABLE hours_of_operations ADD COLUMN hours TSrange
次に、次のステートメントを使用して時間を更新します列:
UPDATE hours_of_operations SET hours = tsrange(opens_on || ' ' || opens_at, closes_on || ' ' || closes_at)
テーブル構造を更新した後、元の質問の要件を満たす、より簡潔で効率的な SQL クエリを作成できます:
SELECT * FROM hours_of_operations WHERE current_timestamp @> hours
このクエリは @> 演算子を使用して、現在の時点が保存されている時間の範囲内にあるかどうかを確認します。タイム ゾーンの問題を考慮する必要がある場合は、適切な時間関数を使用して、現在の時刻を UTC またはその他の希望のタイム ゾーンに変換します。
tsrange を使用する利点は次のとおりです。
以上が「tsrange」を使用して PostgreSQL で営業時間を効率的にクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。