Je cherchais la même solution et je suis tombé sur ce message sur Combiner les dates et heures qui se chevauchent pour renvoyer un seul enregistrement de plage qui se chevauche.
Il existe un autre sujet sur les intervalles de date d'emballage.
J'ai testé cela avec différentes plages de dates, y compris celles répertoriées ici, et cela fonctionne correctement à chaque fois.
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
Le résultat est :
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