Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Unisci intervalli di date sovrapposti

Stavo cercando la stessa soluzione e mi sono imbattuto in questo post su Combina datetime sovrapposte per restituire un singolo record di intervallo sovrapposto.

C'è un altro thread sugli intervalli di date di imballaggio.

L'ho testato con vari intervalli di date, inclusi quelli elencati qui, e funziona correttamente ogni volta.

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 

Il risultato è:

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