ホームページ >データベース >mysql チュートリアル >PostgreSQL で特定の年の範囲内のチームのプレーヤーを正しく検索するにはどうすればよいですか?
PostgreSQL での重複する日付範囲の検索
特定のチームに所属していたすべてのプレーヤーを検索するクエリを提供しました。指定された年ですが、正しく動作しません。直面している問題に対処し、重複する日付範囲を検索するための代替解決策を提供しましょう。
元のクエリの問題:
正しいクエリ:
2010 年より前に加入した特定のチームのすべてのプレーヤーを検索します。 2009 年より前に出発していない場合は、次を使用できますクエリ:
SELECT DISTINCT p.* FROM team AS t JOIN contract AS c ON t.name_team = c.name_team JOIN player AS p ON c.name_player = p.name_player WHERE t.name_team = ? AND c.date_join < '2010-01-01' AND c.date_leave >= '2009-01-01';
追加の考慮事項:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)
OVERLAPS 演算子の使用:
PostgreSQL には、使用できる OVERLAPS 演算子も用意されています。重複する範囲を検索します。次のクエリは、OVERLAPS を使用して、範囲 '2009-01-01'、'2010-01-01' と重複するプレーヤーを検索します:
SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS ('2009-01-01', '2010-01-01');
Using a Range Type:
PostgreSQL 9.2 以降では、範囲タイプを使用して日付範囲を表すことができます。これにより、パフォーマンスが向上し、インデックスのサポートが容易になります。
CREATE TYPE date_range AS RANGE (date, date); CREATE INDEX mv_stock_dr_idx ON mv_stock USING gist (daterange(date_join, date_leave)); SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND daterange(date_join, date_leave) &&& daterange('[2009-01-01,2010-01-01)'); -- upper bound excluded
以上がPostgreSQL で特定の年の範囲内のチームのプレーヤーを正しく検索するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。