Ł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