For MSSQL 2012 . This will return MAX contiguous groups:
DECLARE @t TABLE(d DATE) INSERT INTO @t VALUES ('20150311'), ('20150312'), ('20150313'), ('20150316') ;WITH c1 AS(SELECT d, IIF(DATEDIFF(dd,LAG(d, 1, DATEADD(dd, -1, d)) OVER(ORDER BY d), d) = 1, 0, 1) AS n FROM @t), c2 AS(SELECT d, SUM(n) OVER(ORDER BY d) AS n FROM c1) SELECT TOP 1 WITH TIES MIN(d) AS StartDate, MAX(d) AS EndDate, COUNT(*) AS DayCount FROM c2 GROUP BY n ORDER BY DayCount desc
Conclusion:
StartDate EndDate DayCount 2015-03-11 2015-03-13 3
For
('20150311'), ('20150312'), ('20150313'), ('20150316'), ('20150317'), ('20150318'), ('20150319'), ('20150320')
Conclusion:
StartDate EndDate DayCount 2015-03-16 2015-03-20 5
Apply filtering in c1 CTE :
c1 AS(SELECT d, IIF(DATEDIFF(dd,LAG(d, 1, DATEADD(dd, -1, d)) OVER(ORDER BY d), d) = 1, 0, 1) AS n FROM @t WHERE d BETWEEN '20150311' AND '20150320'),
For MSSQL 2008 :
;WITH c1 AS(SELECT d, (SELECT MAX(d) FROM @t it WHERE it.d < ot.d) AS pd FROM @t ot), c2 AS(SELECT d, CASE WHEN DATEDIFF(dd,ISNULL(pd, DATEADD(dd, -1, d)), d) = 1 THEN 0 ELSE 1 END AS n FROM c1), c3 AS(SELECT d, (SELECT SUM(n) FROM c2 ci WHERE ci.d <= co.d) AS n FROM c2 co) SELECT TOP 1 WITH TIES MIN(d) AS StartDate, MAX(d) AS EndDate, COUNT(*) AS DayCount FROM c3 GROUP BY n ORDER BY DayCount desc