¿Existe una forma mejor de combinar los intervalos de fechas superpuestas?
La solución que se me ocurrió es tan simple que ahora me pregunto si alguien más tiene una mejor idea de cómo se podría hacer esto.Fusionar intervalos de fechas superpuestas
/***** DATA EXAMPLE *****/
DECLARE @T TABLE (d1 DATETIME, d2 DATETIME)
INSERT INTO @T (d1, d2)
SELECT '2010-01-01','2010-03-31' UNION SELECT '2010-04-01','2010-05-31'
UNION SELECT '2010-06-15','2010-06-25' UNION SELECT '2010-06-26','2010-07-10'
UNION SELECT '2010-08-01','2010-08-05' UNION SELECT '2010-08-01','2010-08-09'
UNION SELECT '2010-08-02','2010-08-07' UNION SELECT '2010-08-08','2010-08-08'
UNION SELECT '2010-08-09','2010-08-12' UNION SELECT '2010-07-04','2010-08-16'
UNION SELECT '2010-11-01','2010-12-31' UNION SELECT '2010-03-01','2010-06-13'
/***** INTERVAL ANALYSIS *****/
WHILE (1=1) BEGIN
UPDATE t1 SET t1.d2 = t2.d2
FROM @T AS t1 INNER JOIN @T AS t2 ON
DATEADD(day, 1, t1.d2) BETWEEN t2.d1 AND t2.d2
IF @@ROWCOUNT = 0 BREAK
END
/***** RESULT *****/
SELECT StartDate = MIN(d1) , EndDate = d2
FROM @T
GROUP BY d2
ORDER BY StartDate, EndDate
/***** OUTPUT *****/
/*****
StartDate EndDate
2010-01-01 2010-06-13
2010-06-15 2010-08-16
2010-11-01 2010-12-31
*****/
son los intervalos abiertos abierto, cerrado cerrado, abierto-cerrado o cerrado-abierto? Importa porque las condiciones finales varían levemente dependiendo. Para muchos propósitos, open-closed (incluida la primera fecha, excluyendo la segunda fecha) es la mejor representación; abrir-abrir (ambos extremos incluidos) es a menudo lo que las personas tienen en mente. –
Jonathan, estaba pensando en casos cuando los días (fecha de inicio y fecha de finalización) son parte del período. – leoinfo
Es posible hacerlo de una sola pasada, pero es una implementación de cursor, por lo que depende del tamaño del conjunto de datos. –