Recherche de plages de dates qui se chevauchent dans PostgreSQL
Lorsque vous travaillez avec des plages de dates dans PostgreSQL, l'identification des chevauchements est une tâche cruciale. La requête fournie tente de trouver des joueurs qui faisaient partie d'une équipe pendant des années spécifiques, mais contient des erreurs.
Le problème avec la requête fournie
La requête inclut une condition BETWEEN ( DATE_PART('YEAR',date_join) >= ? AND DATE_PART('YEAR',date_leave) <= ?), qui vérifie si le Les composants year des colonnes date_join et date_leave se trouvent dans la plage spécifiée. Cependant, il utilise de manière incorrecte les opérateurs >= et <=, qui incluent la limite supérieure (fin d'année).
La requête corrigée
Pour trouver correctement les chevauchements plages, nous devons ajuster les conditions pour exclure la limite supérieure :
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) < ?</p> <p><strong>Solution alternative utilisant la plage Types</strong></p> <p>PostgreSQL versions 9.2 et ultérieures prennent en charge les types de plage. Voici une requête qui utilise un type de plage et l'opérateur &&& pour rechercher des plages de dates qui se chevauchent :</p> <pre class="brush:php;toolbar:false">SELECT DISTINCT name_player FROM contract WHERE name_team = ? AND daterange(date_join, date_leave) &&& daterange '[2009-01-01,2010-01-01)'
Cette requête exploite l'opérateur de chevauchement &&& et un type de plage spécialement défini pour rechercher des plages de dates qui se chevauchent sans avoir besoin de limite explicite. chèques.
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!