Überlappende Datumsbereiche in PostgreSQL finden
Problem:
Ihre Anfrage zum Finden von Spielern auf Ein Team in bestimmten Jahren scheint falsch zu sein. Korrigieren Sie die Abfrage und geben Sie die fehlenden Details an.
Falsche Abfrage:
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) <= ?
Ursache:
Die Abfrage funktioniert Es werden keine überlappenden Datumsbereiche gefunden, da der BETWEEN-Operator falsch verwendet wird. Für einen ordnungsgemäßen Vergleich sollte die Obergrenze ausgeschlossen werden.
Richtige Antwort:
Grundlegende Abfrage:
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';
Verfeinerte Abfrage mit Distinct und NULL Handhabung:
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);
Verwendung des OVERLAPS-Operators:
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');
Verwendung von Bereichstypen und Indexunterstützung:
SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND daterange(date_join, date_leave) &&& daterange '[2009-01-01,2010-01-01)';
Denken Sie daran, das „?“ zu ersetzen. Platzhalter mit den erforderlichen Werten in Ihren Abfragen.
Das obige ist der detaillierte Inhalt vonWie finde ich überlappende Datumsbereiche in PostgreSQL-Abfragen richtig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!