Detect consecutive dates ranges using SQL

后端 未结 7 1229
南笙
南笙 2020-11-28 07:54

I want to fill the calendar object which requires start and end date information. I have one column which contains a sequence of dates. Some of the dates are consecutive (ha

7条回答
  •  悲哀的现实
    2020-11-28 08:46

    Here it is my sample with test data:

    --required output
    -- 01 - 03
    -- 08 - 09
    -- 12 - 14
    
    DECLARE @maxRN int;
    WITH #tmp AS (
                    SELECT CAST('2013-01-01' AS date) DT
        UNION ALL   SELECT CAST('2013-01-02' AS date)
        UNION ALL   SELECT CAST('2013-01-03' AS date)
        UNION ALL   SELECT CAST('2013-01-05' AS date)
        UNION ALL   SELECT CAST('2013-01-08' AS date)
        UNION ALL   SELECT CAST('2013-01-09' AS date)
        UNION ALL   SELECT CAST('2013-01-12' AS date)
        UNION ALL   SELECT CAST('2013-01-13' AS date)
        UNION ALL   SELECT CAST('2013-01-14' AS date)
    ),
    #numbered AS (
        SELECT 0 RN, CAST('1900-01-01' AS date) DT
        UNION ALL
        SELECT ROW_NUMBER() OVER (ORDER BY DT) RN, DT
        FROM #tmp
    )
    
    SELECT * INTO #tmpTable FROM #numbered;
    SELECT @maxRN = MAX(RN) FROM #tmpTable;
    
    INSERT INTO #tmpTable
    SELECT @maxRN + 1, CAST('2100-01-01' AS date);
    
    WITH #paired AS (
        SELECT 
        ROW_NUMBER() OVER(ORDER BY TStart.DT) RN, TStart.DT DTS, TEnd.DT DTE
        FROM #tmpTable TStart
        INNER JOIN #tmpTable TEnd 
        ON TStart.RN = TEnd.RN - 1
        AND DATEDIFF(dd,TStart.DT,TEnd.DT) > 1  
    )
    
    SELECT TS.DTE, TE.DTs 
    FROM #paired TS
    INNER JOIN #paired TE ON TS.RN = TE.RN -1
    AND TS.DTE <> TE.DTs -- you could remove this filter if you want to have start and end on the same date
    
    DROP TABLE #tmpTable
    

    Replace #tmp data with your actual table.

提交回复
热议问题