sql >> Base de Datos >  >> RDS >> Sqlserver

Combinar intervalos de fechas superpuestas

Estaba buscando la misma solución y encontré esta publicación sobre Combinar fecha y hora superpuestas para devolver un único registro de rango superpuesto.

Hay otro hilo sobre intervalos de fechas de empaque.

Probé esto con varios intervalos de fechas, incluidos los que se enumeran aquí, y siempre funciona correctamente.

SELECT 
       s1.StartDate,
       --t1.EndDate 
       MIN(t1.EndDate) AS EndDate
FROM @T s1 
INNER JOIN @T t1 ON s1.StartDate <= t1.EndDate
  AND NOT EXISTS(SELECT * FROM @T t2 
                 WHERE t1.EndDate >= t2.StartDate AND t1.EndDate < t2.EndDate) 
WHERE NOT EXISTS(SELECT * FROM @T s2 
                 WHERE s1.StartDate > s2.StartDate AND s1.StartDate <= s2.EndDate) 
GROUP BY s1.StartDate 
ORDER BY s1.StartDate 

El resultado es:

StartDate  | EndDate
2010-01-01 | 2010-06-13
2010-06-15 | 2010-06-25
2010-06-26 | 2010-08-16
2010-11-01 | 2010-12-31