Heim >Datenbank >MySQL-Tutorial >Wie finde ich in PostgreSQL korrekt Spieler in einem Team innerhalb eines bestimmten Jahresbereichs?
Überlappende Datumsbereiche in PostgreSQL finden
Sie haben eine Abfrage bereitgestellt, die versucht, alle Spieler zu finden, die in einem bestimmten Team waren angegebenes Jahr, aber es funktioniert nicht richtig. Lassen Sie uns die Probleme angehen, mit denen Sie konfrontiert sind, und eine alternative Lösung zum Auffinden überlappender Datumsbereiche bereitstellen.
Probleme mit der ursprünglichen Abfrage:
Richtige Abfrage:
Um alle Spieler eines bestimmten Teams zu finden, die vor 2010 beigetreten sind und nicht vor 2009 gegangen sind, Sie können die folgende Abfrage verwenden:
SELECT DISTINCT p.* FROM team AS t JOIN contract AS c ON t.name_team = c.name_team JOIN player AS p ON c.name_player = p.name_player WHERE t.name_team = ? AND c.date_join < '2010-01-01' AND c.date_leave >= '2009-01-01';
Zusätzlich Überlegungen:
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)
Verwendung des OVERLAPS-Operators:
PostgreSQL bietet auch den OVERLAPS-Operator, der zum Auffinden überlappender Bereiche verwendet werden kann. Die folgende Abfrage verwendet OVERLAPS, um Spieler zu finden, die sich mit dem Bereich „01.01.2009“, „01.01.2010“ überschneiden:
SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS ('2009-01-01', '2010-01-01');
Verwenden eines Bereichstyps:
In PostgreSQL 9.2 oder höher können Sie einen Bereichstyp verwenden, um Datumsbereiche darzustellen. Dies sorgt für eine bessere Leistung und ermöglicht eine einfachere Indexunterstützung.
CREATE TYPE date_range AS RANGE (date, date); CREATE INDEX mv_stock_dr_idx ON mv_stock USING gist (daterange(date_join, date_leave)); SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND daterange(date_join, date_leave) &&& daterange('[2009-01-01,2010-01-01)'); -- upper bound excluded
Das obige ist der detaillierte Inhalt vonWie finde ich in PostgreSQL korrekt Spieler in einem Team innerhalb eines bestimmten Jahresbereichs?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!