ホームページ > データベース > mysql チュートリアル > PostgreSQL クエリで重複する日付範囲を正しく見つける方法

PostgreSQL クエリで重複する日付範囲を正しく見つける方法

Susan Sarandon
リリース: 2025-01-05 00:32:39
オリジナル
525 人が閲覧しました

How to Correctly Find Overlapping Date Ranges in PostgreSQL Queries?

PostgreSQL での重複する日付範囲の検索

問題:

プレーヤーを検索するためのクエリ特定の年のチームが間違っているようです。クエリを修正し、不足している詳細を入力してください。

間違ったクエリ:

SELECT *
FROM contract
JOIN team USING (name_team)
JOIN player USING(name_player)
WHERE name_team = ?
AND DATE_PART('YEAR',date_join) >= ?
AND DATE_PART('YEAR',date_leave) <= ?
ログイン後にコピー

原因:

クエリは次のようになります。 BETWEEN 演算子が間違って使用されているため、重複する日付範囲が見つかりません。適切に比較するには、上限を除外する必要があります。

正しい答え:

基本的なクエリ:

SELECT p.*
FROM team AS t
JOIN contract AS c USING (name_team)
JOIN player AS p USING (name_player)
WHERE t.name_team = ?
AND c.date_join < date '2010-01-01'
AND c.date_leave >= date '2009-01-01';
ログイン後にコピー

Distinct と NULL を使用した洗練されたクエリ処理:

SELECT DISTINCT p.*
FROM contract AS c
JOIN player AS p USING (name_player)
WHERE c.name_team = ?
AND c.date_join < date '2010-01-01'
AND (c.date_leave >= date '2009-01-01' OR c.date_leave IS NULL);
ログイン後にコピー

OVERLAPS 演算子の使用:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS
(date '2009-01-01', date '2010-01-01');
ログイン後にコピー

範囲タイプとインデックスのサポートの使用:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
daterange '[2009-01-01,2010-01-01)';
ログイン後にコピー

「?」を忘れずに置き換えてください。クエリに必要な値を含むプレースホルダー。

以上がPostgreSQL クエリで重複する日付範囲を正しく見つける方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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