
PostgreSQL での重複する日付範囲の検索
当面のタスクは、指定された時間内に特定のチームに関連付けられているプレーヤーのリストを取得することですフレーム。提供されたクエリはこれを達成しようとしていますが、ロジックが正しくないことと、重複する範囲を識別する方法についての根本的な誤解が原因で不十分です。
必要な時間枠内のプレーヤーを正確に識別するクエリを作成するには、いくつかの重要な原則が必要です。考慮する必要があります:
-
適切な日付範囲の比較: 元のクエリで使用されている BETWEEN 演算子、上限も含まれます。これは、排他的である必要がある重複する範囲を扱う場合には正しくありません。代わりに、適切な比較は < です。 or = 下限と上限の間で、指定された範囲内の日付のみがキャプチャされるようにします。
-
NULL 値の考慮: まだチームを離れていないプレーヤーの場合、 date_leave 列は NULL である可能性があります。クエリでは、重複する範囲の比較に NULL 値を含めることを許可することで、この可能性を考慮する必要があります。
-
潜在的な重複の処理: 同じプレーヤーに複数のコントラクトが存在する場合、統合することが不可欠です。結果から重複を排除します。 DISTINCT キーワードを使用すると、一意のプレーヤー名のみが返されるようにすることができます。
-
SQL OVERLAPS 演算子: PostgreSQL は、組み込みの OVERLAPS 演算子を提供します。期間が交差します。この演算子は、明示的な日付比較の必要性を排除することでクエリを簡素化できます。
-
範囲タイプ: PostgreSQL 9.2 以降では、日付範囲を表すために特殊な範囲タイプを使用できます。これらのタイプにより、効率的な重複範囲の比較が可能になり、クエリの最適化に利用できます。
これらの原則を組み込むことで、提供された改訂されたクエリは元のクエリの欠点に対処し、特定のチームのプレーヤーを正確に識別します。指定された期間内:
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');
ログイン後にコピー
以上がPostgreSQL で特定の日付範囲内でチームのプレーヤーを効率的に見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。