Вы можете получить первый день текущего месяца с trunc(sysdate, 'MM')
, затем вычесть месяц, чтобы получить первый день предыдущего месяца; затем используйте last_day()
, чтобы получить последний день этого месяца; затем extract()
номер дня от этого:
select extract(day from last_day(add_months(trunc(sysdate, 'MM'), -1)))
from dual;
EXTRACT(DAYFROMLAST_DAY(ADD_MONTHS(TRUNC(SYSDATE,'MM'),-1)))
------------------------------------------------------------
31
Главным образом, просто для удовольствия, вы можете увидеть числа, получаемые, скажем, за последние шесть месяцев, с помощью иерархического запроса:
select last_day(add_months(trunc(sysdate, 'MM'), - level)) as last_date,
extract(day from last_day(add_months(trunc(sysdate, 'MM'), - level))) as last_day_number
from dual
connect by level <= 6;
LAST_DATE LAST_DAY_NUMBER
---------- ---------------
2019-03-31 31
2019-02-28 28
2019-01-31 31
2018-12-31 31
2018-11-30 30
2018-10-31 31
Как отметил @GordonLinoff, вызов trunc()
немного избыточен - потому что add_months()
довольно простителен, так что вы можете упростить далее:
select extract(day from last_day(add_months(sysdate, -1)))
from dual;
Вместо этого вы также можете использовать вычитание интервала, но тогда вам сначала нужно урезать текущую дату, так как это не понравится датам в конце месяца, если в предыдущем месяце меньше дней:
select extract(day from last_day(trunc(sysdate, 'MM') - interval '1' month))
from dual;