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 サイトの他の関連記事を参照してください。