Recherche de plages de dates qui se chevauchent dans PostgreSQL
Problème :
Votre requête pour trouver des joueurs sur une équipe dans des années spécifiques semble être incorrecte. Corrigez la requête et fournissez les détails manquants.
Requête incorrecte :
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) <= ?
Cause :
La requête ne ne trouve pas de plages de dates qui se chevauchent, car l'opérateur BETWEEN n'est pas utilisé correctement. La limite supérieure doit être exclue pour une comparaison appropriée.
Réponse appropriée :
Requête de base :
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';
Requête raffinée avec Distinct et NULL Gestion :
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);
Utilisation de l'opérateur 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');
Utilisation des types de plages et de la prise en charge des index :
SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND daterange(date_join, date_leave) &&& daterange '[2009-01-01,2010-01-01)';
N'oubliez pas de remplacer le '?' des espaces réservés avec les valeurs nécessaires dans vos requêtes.
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!