ホームページ > データベース > mysql チュートリアル > 「tsrange」を使用して PostgreSQL で営業時間を効率的にクエリするにはどうすればよいですか?

「tsrange」を使用して PostgreSQL で営業時間を効率的にクエリするにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-04 14:26:38
オリジナル
256 人が閲覧しました

How Can I Efficiently Query Business Hours in PostgreSQL Using `tsrange`?

PostgreSQL でこの営業時間クエリを実行する

元の質問は、SQL を使用して ActiveRecord (RoR) アプリケーションの特定の営業時間範囲を満たすレコードをクエリする方法を示しています。クエリは複雑な条件を使用して、現在の時点と保存された値を比較します。この問題では、時刻値を何らかの日付型に変換し、PostgreSQL に比較を処理させることでこれが可能かどうかという疑問が生じます。

ベスト プラクティス: tsrange 型を使用する

この問題を解決するには、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 を使用する利点は次のとおりです。

  • クエリはシンプルで理解しやすいです。
  • 複雑な比較ロジックを回避し、パフォーマンスを向上させます。
  • 1 日にわたる営業時間やパッケージ サイクルなど、複雑な営業時間をサポートします。
  • PostgreSQL が提供する他の時間関連の関数やインデックスと一緒に使用できます。

以上が「tsrange」を使用して PostgreSQL で営業時間を効率的にクエリするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート