CTE – generowanie listy dat z zakresu od-do

16-Sty-2013

Ł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

Dodaj komentarz:

Autor: Rafał Kraik