Как заполнить таблицу интервалом дат?
Есть таблица формата
| 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 шт):
Автор решения: ValNik
→ Ссылка
Я немного поправлю Ваш код. Иначе получается бесконечная рекурсия или переполнение, что раньше.
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,[Дата]))<= [МаксДата]
)