#sql #oracle #datetime #recursive-query
#sql #Oracle #дата и время #рекурсивный-запрос
Вопрос:
С ЯНВАРЯ-19 до октября-2020, каким будет запрос для получения каждого последнего дня каждого месяца, начиная с января-19 до текущего года?
Ожидаемый результат
Last Day
--------
31-JAN-2019
28-FEB-2019
31-MAR-2019
...
31-JAN-2020
29-FEB-2020
31-MAR-2020
Ответ №1:
SQL> select last_day(add_months(date'2019-01-01',level-1)) dt from dual connect by level<=24;
DT
-------------------
2019-01-31 00:00:00
2019-02-28 00:00:00
2019-03-31 00:00:00
2019-04-30 00:00:00
2019-05-31 00:00:00
2019-06-30 00:00:00
2019-07-31 00:00:00
2019-08-31 00:00:00
2019-09-30 00:00:00
2019-10-31 00:00:00
2019-11-30 00:00:00
2019-12-31 00:00:00
2020-01-31 00:00:00
2020-02-29 00:00:00
2020-03-31 00:00:00
2020-04-30 00:00:00
2020-05-31 00:00:00
2020-06-30 00:00:00
2020-07-31 00:00:00
2020-08-31 00:00:00
2020-09-30 00:00:00
2020-10-31 00:00:00
2020-11-30 00:00:00
2020-12-31 00:00:00
Ответ №2:
Мне нравится использовать стандартные рекурсивные запросы для этого:
with cte (dt) as (
select date '2019-01-01' dt from dual
union all select add_months(dt, 1) from cte where dt < add_months(sysdate, -1)
)
select last_day(dt) dt from cte
При этом генерируются все даты окончания месяцев с января 2019 года по текущий месяц (включительно).