Это просто делает последовательные дни между двумя датами, но я написал, чтобы показать, что вы можете устранить рекурсивную ошибку, указав предел.
with temp (level, seqdate) as
(select 1, date('2008-01-01')
from sysibm.sysdummy1
union all
select level, seqdate + level days
from temp
where level < 1000
and seqdate + 1 days < Date('2008-02-01')
)
select seqdate as CalendarDay
from temp
order by seqdate
Обновление от pax:
Этот ответ фактически поставил меня на правильный путь. Вы можете избавиться от предупреждения, введя переменную, ограниченную константой. В приведенном выше запросе он не был вполне правильным (и неправильно указали даты, которые я прощу), но, поскольку он указал мне на решение проблемы, он выиграл приз.
Код ниже был окончательной рабочей версией (без предупреждения):
WITH DATERANGE(LEVEL,DT) AS (
SELECT 1, CURRENT DATE + (1 - DAY(CURRENT DATE)) DAYS - 2 MONTHS
FROM SYSIBM.SYSDUMMY1
UNION ALL SELECT LEVEL + 1, DT + 1 DAY
FROM DATERANGE
WHERE LEVEL < 1000 AND DT < CURRENT DATE - 1 DAY
) SELECT DT FROM DATERANGE;
, который выводится при запуске 2 и февраля:
----------
DT
----------
2009-12-01
2009-12-02
2009-12-03
: : : :
2010-01-30
2010-01-31
2010-02-01
DSNE610I NUMBER OF ROWS DISPLAYED IS 63
DSNE616I STATEMENT EXECUTION WAS SUCCESSFUL.