Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Überlappende Datumsintervalle zusammenführen

Ich habe nach der gleichen Lösung gesucht und bin auf diesen Beitrag zum Kombinieren von überlappenden Datums- und Uhrzeitangaben gestoßen, um einen einzelnen überlappenden Bereichsdatensatz zurückzugeben.

Es gibt einen weiteren Thread zu Packdatumsintervallen.

Ich habe dies mit verschiedenen Datumsbereichen getestet, einschließlich der hier aufgeführten, und es funktioniert jedes Mal korrekt.

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 

Das Ergebnis ist:

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