Recherche de plages de dates qui se chevauchent dans PostgreSQL
La tâche à accomplir est de récupérer une liste de joueurs associés à une équipe spécifique dans un délai imparti cadre. Bien que la requête fournie tente d'y parvenir, elle échoue en raison d'une logique incorrecte et d'une incompréhension fondamentale sur la façon d'identifier les plages qui se chevauchent.
Pour créer une requête qui identifie avec précision les joueurs dans le laps de temps souhaité, plusieurs principes clés doit être pris en compte :
-
Comparaison appropriée des plages de dates : L'opérateur BETWEEN, tel qu'utilisé dans la requête d'origine, inclut la limite supérieure. Ceci est incorrect lorsqu'il s'agit de plages qui se chevauchent, qui devraient être exclusives. Au lieu de cela, la comparaison appropriée est un < ou = entre la limite inférieure et la limite supérieure, garantissant que seules les dates comprises dans la plage spécifiée sont capturées.
-
Considération des valeurs NULL : Pour les joueurs qui n'ont pas encore quitté l'équipe, le La colonne date_leave peut être NULL. La requête doit tenir compte de cette possibilité en permettant aux valeurs NULL d'être incluses dans la comparaison des plages qui se chevauchent.
-
Gestion des doublons potentiels : Lorsque plusieurs contrats existent pour le même joueur, il est impératif de les consolider. les résultats pour éliminer les doublons. Le mot-clé DISTINCT peut être utilisé pour garantir que seuls les noms de joueurs uniques sont renvoyés.
-
Opérateur SQL OVERLAPS : PostgreSQL propose un opérateur OVERLAPS intégré, spécialement conçu pour déterminer si deux fois les périodes se croisent. Cet opérateur peut simplifier la requête en éliminant le besoin de comparaisons de dates explicites.
-
Types de plage : Dans PostgreSQL 9.2 et versions ultérieures, des types de plage spécialisés sont disponibles pour représenter les plages de dates. Ces types permettent des comparaisons efficaces de plages de chevauchement et peuvent être utilisés pour optimiser la requête.
En incorporant ces principes, la requête révisée fournie corrige les lacunes de la requête d'origine et identifie avec précision les joueurs d'une équipe donnée. dans le délai imparti :
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');
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