Recherche de plages de dates qui se chevauchent dans PostgreSQL
Vous avez fourni une requête qui tente de trouver tous les joueurs qui faisaient partie d'une équipe spécifique dans une année donnée, mais cela ne fonctionne pas correctement. Résolvons les problèmes auxquels vous êtes confrontés et proposons une solution alternative pour rechercher des plages de dates qui se chevauchent.
Problèmes avec la requête d'origine :
Requête correcte :
Pour trouver tous les joueurs d'une équipe donnée qui ont rejoint avant 2010 et ne sont pas partis avant 2009, vous pouvez utiliser la requête suivante :
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';
Supplémentaire Considérations :
AND (c.date_leave >= '2009-01-01' OR c.date_leave IS NULL)
Utilisation de l'opérateur OVERLAPS :
PostgreSQL fournit également l'opérateur OVERLAPS, qui peut être utilisé pour rechercher des plages qui se chevauchent. La requête suivante utilise OVERLAPS pour rechercher les joueurs qui chevauchaient la plage « 2009-01-01 », « 2010-01-01 » :
SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND (date_join, COALESCE(date_leave, CURRENT_DATE)) OVERLAPS ('2009-01-01', '2010-01-01');
Utilisation d'un type de plage :
Dans PostgreSQL 9.2 ou version ultérieure, vous pouvez utiliser un type de plage pour représenter des plages de dates. Cela offre de meilleures performances et permet une prise en charge plus facile des index.
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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!