Ładny przykład na CTE znalazłem:
http://blog.justinstolle.com/sql-turn-a-date-range-into-a-list-of-dates/
Przykład ma wygenerować listę dat w oparciu o zapisany w rekordzie przedział dat. Na wszelki wypadek przeklejam przykład poniżej:
DECLARE @dateranges TABLE (range_id VARCHAR(2), date_begin DATETIME, date_end DATETIME)
INSERT @dateranges SELECT 'A’, '2010-01-01′, '2010-01-03′
INSERT @dateranges SELECT 'B’, '2008-02-27′, '2008-03-01′
INSERT @dateranges SELECT 'C’, '2010-04-26′, '2010-04-26
'INSERT @dateranges SELECT 'D’, '2000-02-01′, '2003-02-20′ ;
WITH cte (id, d)
AS (
SELECT tbl.range_id AS id ,tbl.date_begin AS d
FROM @dateranges tbl
WHERE DATEDIFF(DAY, tbl.date_begin, tbl.date_end) <= 100
UNION ALL
SELECT tbl.range_id AS id ,DATEADD(DAY, 1, cte.d) AS d
FROM cte
INNER JOIN @dateranges tbl ON cte.id = tbl.range_id
WHERE cte.d < tbl.date_end)
SELECT id AS range_id ,d AS date_within_range FROM cte ORDER BY id, d