Detect consecutive dates ranges using SQL Detect consecutive dates ranges using SQL sql-server sql-server

Detect consecutive dates ranges using SQL


No joins or recursive CTEs needed. The standard gaps-and-island solution is to group by (value minus row_number), since that is invariant within a consecutive sequence. The start and end dates are just the MIN() and MAX() of the group.

WITH t AS (  SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i  FROM @d  GROUP BY InfoDate)SELECT MIN(d),MAX(d)FROM tGROUP BY DATEDIFF(day,i,d)


Here you go..

;WITH CTEDATESAS(    SELECT ROW_NUMBER() OVER (ORDER BY Infodate asc ) AS ROWNUMBER,infodate FROM YourTableName  ), CTEDATES1AS(   SELECT ROWNUMBER, infodate, 1 as groupid FROM CTEDATES WHERE ROWNUMBER=1   UNION ALL   SELECT a.ROWNUMBER, a.infodate,case datediff(d, b.infodate,a.infodate) when 1 then b.groupid else b.groupid+1 end as gap FROM CTEDATES A INNER JOIN CTEDATES1 B ON A.ROWNUMBER-1 = B.ROWNUMBER)select min(mydate) as startdate, max(infodate) as enddate from CTEDATES1 group by groupid

please don't forget to mark it as answer, if this answers your question.


I have inserted these values into a table called #consec and then perforemed the following:

select t1.*,t2.infodate as binfodinto #temp1from #consec t1left join #consec t2 on dateadd(DAY,1,t1.infodate)=t2.infodateselect t1.*,t2.infodate as binfodinto #temp2from #consec t1left join #consec t2 on dateadd(DAY,1,t2.infodate)=t1.infodate;with cte as(select infodate,  ROW_NUMBER() over(order by infodate asc) as seq from #temp1where binfod is null),cte2 as(select infodate, ROW_NUMBER() over(order by infodate asc) as seq from #temp2where binfod is null)select t2.infodate as [start_date],t1.infodate as [end_date] from cte t1left join cte2 t2 on t1.seq=t2.seq 

As long as your date periods are not overlapping, that should do the job for you.