We have a table of days like:
ID Date 1 2015-07-29 2 2015-07-30 3 2015-07-31 4 2015-08-01 5 2015-08-03 7 2015-08-04 8 2015-08-05 9 2015-08-06 10 2015-08-07 11 2015-08-10
And we want to find all the sequences (day + 1). The result should be something like this:
Start End 2015-07-29 2015-08-01 2015-08-03 2015-08-07 2015-08-10 2015-08-10
1. Update
First, I changed the answer of Divanche of Calra to use RowNumber instead of Id (Id is auto-increment, so itβs possible that identifiers are missing)
DECLARE @P TABLE(DATE DATE) INSERT INTO @P SELECT MIN([DATE]) FROM MietvertragsArtikelDays UNION SELECT T1.[DATE] FROM (SELECT ROW_NUMBER() OVER (ORDER BY [DATE]) RowNumber, [DATE] FROM MietvertragsArtikelDays) AS T1 INNER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY [DATE]) RowNumber, [DATE] FROM MietvertragsArtikelDays) AS T2 ON T1.RowNumber=T2.RowNumber+1 WHERE DATEDIFF(DAY,T2.[DATE],T1.[DATE]) <>1 UNION SELECT T2.[DATE] FROM (SELECT ROW_NUMBER() OVER (ORDER BY [DATE]) RowNumber, [DATE] FROM MietvertragsArtikelDays) AS T1 INNER JOIN (SELECT ROW_NUMBER() OVER (ORDER BY [DATE]) RowNumber, [DATE] FROM MietvertragsArtikelDays) AS T2 ON T1.RowNumber=T2.RowNumber+1 WHERE DATEDIFF(DAY,T2.[DATE],T1.[DATE]) <>1 DECLARE @X TABLE(DATE DATE, RN INT) INSERT INTO @X SELECT *, ROW_NUMBER() OVER(ORDER BY [DATE]) AS X FROM @P SELECT A.[DATE] Start, ISNULL(B.[DATE],A.[DATE]) [End] FROM @XA LEFT JOIN (SELECT [DATE], RN-1 AS RN FROM @X) B ON A.RN=B.RN WHERE A.RN%2=1
2. Update
The most elegant solution - Ughais
;WITH CTE as ( SELECT *,DATEDIFF(D,0,[Date]) - ROW_NUMBER()OVER(ORDER BY ID ASC) grp FROM MietvertragsArtikelDays ) SELECT MIN([Date]),MAX([Date]) FROM CTE GROUP BY grp
source share