Дата гггг-мм в формате целое число - PullRequest
0 голосов
/ 20 марта 2019

Мне нужно взять текущий месяц, вычесть один месяц, затем преобразовать его в формат гггг-мм и преобразовать в целое число. Затем присвойте его переменной для следующего сравнения в предложении where.

Так что логика для этого будет выглядеть как

  1. Сегодня 20.03.2019 (или любой другой день и месяц)
  2. После вычитания 01.02.2019
  3. После преобразования в формат ГГГГ-ММ это 201902
  4. После преобразования в целое число это 201902 целое число

Не могли бы вы помочь мне с подходом SQL в Oracle?

Ответы [ 3 ]

2 голосов
/ 20 марта 2019

Вы можете использовать выражение:

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 - или просто повторить полное выражение.

1 голос
/ 20 марта 2019

Add_months будет вычтено из вашей даты, которую вы затем отформатируете по мере необходимости и преобразуете в char и to number.

select to_number(to_char(add_months(sysdate, -1), 'YYYYMM')) from dual
0 голосов
/ 20 марта 2019

Я не знаю, как это будет вам полезно, но вот некоторая реализация:

  1. Взять текущую дату;

  2. Вы можете использовать функцию ADD_MONTHS(), чтобы получить предыдущий месяц;

  3. Я вижу, что вы усекаете дату, поэтому я также сделал это с TRUNC(,'MM');

  4. Преобразуйте его в формат, который вы упомянули;

  5. Преобразовать его в число;

SELECT TO_NUMBER(TO_CHAR(TRUNC(ADD_MONTHS(SYSDATE, -1),'MM'),'YYYYMM')) FROM DUAL;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...