Este es un problema clásico, y en realidad es más fácil si se invierte la lógica.
Déjeme darle un ejemplo.
Voy a publicar un período de tiempo aquí, y todas las diferentes variaciones de otros períodos que se superponen de alguna manera.
|-------------------| 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
por el contrario, me deja publicar todos aquellos que no se solapa:
|-------------------| compare to this one
|---| ends before
|---| starts after
lo tanto, si la comparación sencilla reduce a:
starts after end
ends before start
entonces te encuentre todos aquellos que no se superponen, y luego encontrará todos los períodos que no coinciden.
Para su ejemplo final NOT IN LIST, puede ver que coincide con esas dos reglas.
Usted tendrá que decidir wether los siguientes períodos están en o fuera de sus rangos:
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
Si la tabla tiene columnas llamadas RANGE_END y RANGE_START, aquí hay algo de SQL sencilla para recuperar todas las filas coincidentes:
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
Nota del nO allí. Dado que las dos reglas simples encuentran todas las filas que no coinciden, un NOT simple lo invertirá para decir: si no es una de las filas que no coinciden, tiene que ser una de las equivalentes.
aplicación lógica de inversión simple aquí para deshacerse del NO y que va a terminar con:
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start
posible duplicado de [determinar si dos intervalos de fecha de superposición] (http://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap) –