C'est un problème classique, et c'est en fait plus facile si on inverse la logique.
Laissez-moi vous donner un exemple.
Je vais afficher une période de temps ici, et toutes les différentes variations d'autres périodes qui se chevauchent d'une manière ou d'une autre.
|-------------------| compare to this one
|---------| contained within
|----------| contained within, equal start
|-----------| contained within, equal end
|-------------------| contained within, equal start+end
|------------| not fully contained, overlaps start
|---------------| not fully contained, overlaps end
|-------------------------| overlaps start, bigger
|-----------------------| overlaps end, bigger
|------------------------------| overlaps entire period
d'un autre côté, laissez-moi afficher tous ceux qui ne se chevauchent pas :
|-------------------| compare to this one
|---| ends before
|---| starts after
Donc si vous réduisez simplement la comparaison à :
starts after end
ends before start
puis vous trouverez toutes celles qui ne se chevauchent pas, et enfin vous trouverez toutes les périodes non concordantes.
Pour votre dernier exemple NOT IN LIST, vous pouvez voir qu'il correspond à ces deux règles.
Vous devrez décider si les périodes suivantes sont DANS ou HORS de vos plages :
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
Si votre table possède des colonnes appelées range_end et range_start, voici un langage SQL simple pour récupérer toutes les lignes correspondantes :
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
Notez le PAS là-dedans. Puisque les deux règles simples trouvent toutes les non assortie les rangs, un simple NOT l'inversera pour dire : si ce n'est pas une des rangées non correspondantes, ce doit être une des rangées correspondantes. .
En appliquant une simple logique d'inversion ici pour se débarrasser du NOT, on obtient.. :
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start
1 votes
Duplicata possible de Déterminer si deux plages de dates se chevauchent