Вы можете использовать выражение:
to_number(to_char(trunc(add_months(sysdate, -1), 'MM'), 'YYYYMM'))
add_months(sysdate, -1)
дает вам сегодняшнюю дату месяц назад.
trunc(add_months(sysdate, -1), 'MM')
дает вам первый день этого месяца через аргумент MM
, равный trunc()
.
to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM')
преобразует это в строку как '201902'
.
Наконец to_number(to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM'))
преобразует эту строку в число.
Шаг усечения на самом деле не нужен, так как вы все равно игнорируете часть дня, но я оставил его, чтобы соответствовать значению, показанному на вашем втором шаге.
Вы также можете сделать trunc(sysdate, 'MM') - interval '1' month
- вычесть интервал после того, как урежет текущий месяц до его первого дня. С другой стороны, или без усечения, вы можете получить ошибку даты, например, если работает 31 июля - как нет 31 июня.
Примеры:
select to_number(to_char(trunc(add_months(sysdate, -1), 'MM'), 'YYYYMM')) from dual;
TO_NUMBER(TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE,-1),'MM'),'YYYYMM'))
---------------------------------------------------------------
201902
select to_number(to_char(add_months(sysdate, -1), 'YYYYMM')) from dual;
TO_NUMBER(TO_CHAR(ADD_MONTHS(SYSDATE,-1),'YYYYMM'))
---------------------------------------------------
201902
select to_number(to_char(trunc(sysdate, 'MM') - interval '1' month, 'YYYYMM')) from dual;
TO_NUMBER(TO_CHAR(TRUNC(SYSDATE,'MM')-INTERVAL'1'MONTH,'YYYYMM'))
-----------------------------------------------------------------
201902
Затем присвойте его переменной для следующего сравнения в предложении where.
Вы можете использовать это выражение непосредственно в предложении where
. Если вы включаете его в список выбора, вы можете дать ему псевдоним столбца; но вы не можете ссылаться на этот псевдоним в предложении where
на том же уровне запроса. Вам нужно будет использовать подзапрос (встроенный просмотр) или CTE - или просто повторить полное выражение.