Maison >base de données >tutoriel mysql >Comment rechercher correctement les plages de dates qui se chevauchent dans les requêtes PostgreSQL ?

Comment rechercher correctement les plages de dates qui se chevauchent dans les requêtes PostgreSQL ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-05 00:32:39533parcourir

How to Correctly Find Overlapping Date Ranges in PostgreSQL Queries?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn