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
Libérer: 2025-01-05 00:32:39
original
525 Les gens l'ont consulté

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) <= ?
Copier après la connexion

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';
Copier après la connexion

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);
Copier après la connexion

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');
Copier après la connexion

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)';
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal