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!