Как заполнить таблицу интервалом дат?

Рейтинг: 0Ответов: 1Опубликовано: 17.04.2023

Есть таблица формата

id Минимум Максимум
01 01.01.2000 03.03.2000
02 02.02.2001 11.05.2001

Необходимо сделать таблицу со списком дат с шагом в месяц для каждого id от минимального к максимальному. И чтобы даты были последним днём месяца. По типу:

id Дата
01 31.01.2000
01 28.02.2000
01 31.03.2000
02 28.02.2001
02 31.03.2001
02 30.04.2001
02 31.05.2001

что-то по типу цикла: для каждого id добавить дату с шагом 1 месяц, пока дата меньше, чем максимум

мой неработающий код:

WITH t AS(
select id, EOMONTH(Минимум) AS min_v, Минимум, Максимум
from my_table
UNION ALL
SELECT id, EOMONTH(DATEADD(m, 1, d)), Минимум, Максимум
FROM t
WHERE EOMONTH(Минимум) <= Максимум) 

пишет ошибку "adding a value to a 'date' column caused an overflow"

Ответы

▲ 1Принят

Я немного поправлю Ваш код. Иначе получается бесконечная рекурсия или переполнение, что раньше.

WITH t AS(
select id, EOMONTH(Минимум) AS d, Минимум, Максимум
from my_table
UNION ALL
SELECT id, EOMONTH(DATEADD(m, 1, d)), Минимум, Максимум
FROM t
WHERE EOMONTH(d) < Максимум) 

Условие нужно WHERE EOMONTH(d) < Максимум) поскольку здесь в сравнении d - от предыдущей итерации.

Вот еще вариант, практически такой же:

create table test (id int,[Минимум] date,[Максимум] date);
insert into test values
 (01,'2000.01.01','2000.03.03')
,(02,'2001.02.02','2001.05.31')
;
with r as(
select id, eomonth([Минимум]) [Дата],eomonth([Максимум]) [МаксДата]
from test
union all
select id, eomonth(dateadd(m,1,[Дата])), [МаксДата]
from r 
where eomonth(dateadd(m,1,[Дата]))<= [МаксДата]
)