C'è un modo migliore di unire intervalli di date sovrapposti?
La soluzione che ho trovato è così semplice che ora mi chiedo se qualcun altro ha un'idea migliore di come questo possa essere fatto.Intervalli di data di sovrapposizione sovrapposti
/***** 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
*****/
sono la intervalli open-aperto, chiuso-chiuso, aperto-chiuso o chiuso-aperto? Importa perché le condizioni di fine variano leggermente in base. Per molti scopi, open-closed (compresa la prima data, esclusa la seconda data) è la migliore rappresentazione; open-open (entrambe le estremità incluse) è spesso ciò che le persone hanno in mente. –
Jonathan, stavo pensando ai casi in cui entrambi i giorni (data di inizio e data di fine) sono parte del periodo. – leoinfo
È possibile eseguirlo a passaggio singolo, ma è un'implementazione del cursore in modo che dipenda dalla dimensione del set di dati. –