Ваш текущий where actfinish >= sysdate-30
вернет данные за текущий месяц, а также проблемы, которые вы упомянули.
Вы можете сделать что-то вроде:
where actfinish >= add_months(trunc(sysdate, 'MM'), -1)
and actfinish < trunc(sysdate, 'MM')
trunc(sysdate, 'MM')
даетВы полночь в первый день текущего месяца.Первый пункт вычитает месяц из этого, поэтому дает вам полночь в первый день предыдущего месяца;второе предложение запрещает включение любой записи за этот месяц.
Вы можете проверить, что они оценивают, запросив термины вне вашего реального запроса:
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
select sysdate,
add_months(trunc(sysdate, 'MM'), -1) as month_from,
trunc(sysdate, 'MM') as month_to
from dual;
SYSDATE MONTH_FROM MONTH_TO
------------------- ------------------- -------------------
2019-01-25 12:59:53 2018-12-01 00:00:00 2019-01-01 00:00:00
alter session
просто длязаставить клиента форматировать результаты определенным образом, вместо того, чтобы явно делать to_char()
.
Когда вы сказали «в БД это выглядит как DD-MMM-YY», на самом деле это не выглядит такв базе данных;когда вы запрашиваете значения даты, ваш клиент форматирует даты подобным образом, поэтому ваш NLS_DATE_FORMAT, вероятно, будет установлен в модель DD-MON-RR по-прежнему по умолчанию.(И в Oracle это MON, а не MMM - см. элементы модели формата в документации .)