Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête pour vérifier les plages qui se chevauchent dans le serveur SQL ?

Le moyen le plus simple de trouver un chevauchement est le suivant :

IF EXISTS (SELECT 1 FROM table WHERE @myValueLo <= ExistingRangeEnd AND @myValueHi >= ExistingRangeStart)
  -- Overlaps
ELSE
  -- Doesn't overlap

Cela peut s'avérer efficace si vous comparez la condition ci-dessus à chacune des barres du diagramme ci-dessous :

Existing range:         |-------------------|
Overlaps:       |-------------|       |------------|
                |----------------------------------|
                           |-------------|
Not overlaps:   |-----|                       |----|

dans tous les cas de chevauchement, ces deux tests sont vrais :

  • la date de début de la plage existante est toujours avant la date de fin de la nouvelle gamme
  • la date de fin de la plage existante est postérieure à la date de début de la nouvelle gamme

Ceux qui ne se chevauchent pas échouent à l'un ou l'autre de ce test.