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
Lepaskan: 2025-01-05 00:32:39
asal
525 orang telah melayarinya

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) <= ?
Salin selepas log masuk

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';
Salin selepas log masuk

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);
Salin selepas log masuk

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');
Salin selepas log masuk

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)';
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan