En MySQL, si tengo una lista de rangos de fechas (rango-inicio y rango-fin). p.ej
10/06/1983 to 14/06/1983
15/07/1983 to 16/07/1983
18/07/1983 to 18/07/1983
Y quiero verificar si otro rango de fechas contiene CUALQUIERA de los rangos que ya están en la lista, ¿cómo haría eso?
p.ej
06/06/1983 to 18/06/1983 = IN LIST
10/06/1983 to 11/06/1983 = IN LIST
14/07/1983 to 14/07/1983 = NOT IN LIST
Respuestas:
Este es un problema clásico, y en realidad es más fácil si inviertes la lógica.
Dejame darte un ejemplo.
Publicaré un período de tiempo aquí y todas las diferentes variaciones de otros períodos que se superponen de alguna manera.
por otro lado, permítanme publicar todos los que no se superponen:
Entonces, si simplemente reduce la comparación a:
luego encontrará todos los que no se superponen, y luego encontrará todos los períodos que no coinciden.
Para su ejemplo final de NOT IN LIST, puede ver que coincide con esas dos reglas.
Deberá decidir si los siguientes períodos están DENTRO o FUERA de sus rangos:
Si su tabla tiene columnas llamadas range_end y range_start, aquí hay un SQL simple para recuperar todas las filas coincidentes:
Tenga en cuenta el 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 que coinciden .
Aplicando una lógica de inversión simple aquí para deshacerse del NOT y terminará con:
fuente
Tomando su rango de ejemplo del 06/06/1983 al 18/06/1983 y asumiendo que tiene columnas llamadas inicio y final para sus rangos, podría usar una cláusula como esta
es decir, compruebe que el inicio de su rango de prueba es antes del final del rango de la base de datos, y que el final de su rango de prueba es posterior o al comienzo del rango de la base de datos.
fuente
Si su RDBMS es compatible con la función OVERLAP (), entonces esto se vuelve trivial, sin necesidad de soluciones propias. (En Oracle aparentemente funciona pero no está documentado).
fuente
En tus resultados esperados dices
06/06/1983 al 18/06/1983 = EN LISTA
Sin embargo, este período no contiene ni está incluido en ninguno de los períodos en su tabla (¡no en la lista!) De períodos. Sin embargo, se superpone al período del 10/06/1983 al 14/06/1983.
Puede encontrar útil el libro de Snodgrass ( http://www.cs.arizona.edu/people/rts/tdbbook.pdf ): es anterior a mysql pero el concepto de tiempo no ha cambiado ;-)
fuente
Creé una función para lidiar con este problema en MySQL. Simplemente convierta las fechas en segundos antes de usarlas.
fuente
Mire el siguiente ejemplo. Te será de gran ayuda.
fuente
Prueba esto en MS SQL
fuente
fuente
Otro método usando BETWEEN sql statement
Periodos incluidos:
Periodos excluidos:
fuente
fuente