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
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.