Rumah >pangkalan data >tutorial mysql >Bagaimana untuk mencari julat tarikh bertindih dengan betul dalam pertanyaan PostgreSQL?

Bagaimana untuk mencari julat tarikh bertindih dengan betul dalam pertanyaan PostgreSQL?

Susan Sarandon
Susan Sarandonasal
2025-01-05 00:32:39533semak imbas

How to Correctly Find Overlapping Date Ranges in PostgreSQL Queries?

Mencari Julat Tarikh Bertindih dalam PostgreSQL

Masalah:

Pertanyaan anda untuk mencari pemain di pasukan dalam tahun-tahun tertentu nampaknya tidak betul. Betulkan pertanyaan dan berikan butiran yang hilang.

Pertanyaan Salah:

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) <= ?

Punca:

Pertanyaan itu tidak mencari julat tarikh bertindih kerana operator BETWEEN digunakan dengan tidak betul. Sempadan atas harus dikecualikan untuk perbandingan yang betul.

Jawapan Betul:

Pertanyaan Asas:

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';

Pertanyaan Ditapis dengan Distinct dan NULL Pengendalian:

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);

Menggunakan Operator 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');

Menggunakan Jenis Julat dan Sokongan Indeks:

SELECT DISTINCT name_player
FROM contract
WHERE name_team = ?
AND daterange(date_join, date_leave) &&&
daterange '[2009-01-01,2010-01-01)';

Ingat untuk menggantikan '?' pemegang tempat dengan nilai yang diperlukan dalam pertanyaan anda.

Atas ialah kandungan terperinci Bagaimana untuk mencari julat tarikh bertindih dengan betul dalam pertanyaan PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn