получить предыдущий месяц из sysdate и сохранить его как число - PullRequest
0 голосов
/ 08 января 2020

помогите пожалуйста .. как получить предыдущий месяц из sysdate и сохранить его как число в переменной? я пробовал это, но это приводит к неверному номеру.

select to_number(to_char(add_months(sysdate, -1) ,'mm')) into l_date from dual 

это возвращает 12, что желательно.

Но когда l_date выполняется в

if l_date in (1,3,5,7,8,10,12)
then
do thisss
end if;

в этом блоке это сбой с недопустимым номером при сравнении, который, я думаю, это не число, а строка или символ.

Ответы [ 3 ]

0 голосов
/ 08 января 2020

Вам не хватает запятой между SYSDATE и -1, и вам не нужно преобразовывать в строку и обратно:

SELECT EXTRACT( MONTH FROM ADD_MONTHS( SYSDATE, -1 ) )
INTO   l_date
FROM   DUAL

или без переключения контекста из PL / SQL до SQL:

l_date := EXTRACT( MONTH FROM ADD_MONTHS( SYSDATE, -1 ) )

или, если вы хотите исправить свой код и преобразовать дату в строку в число, просто добавьте пропущенную запятую:

select to_number(to_char(add_months(sysdate,-1) ,'mm')) into l_date from dual;

дб <> скрипка

0 голосов
/ 08 января 2020

выберите to_number (to_char (add_months (trun c (sysdate, 'mm'), - 1), 'mm')) из двойного;

0 голосов
/ 08 января 2020

Это будет примерно так:

SQL> set serveroutput on
SQL>
SQL> declare
  2    l_prev_month number(2);
  3  begin
  4    l_prev_month := to_number(to_char(trunc(sysdate, 'mm') - 1, 'mm'));
  5    dbms_output.put_line('Previous month = ' || l_prev_month);
  6
  7    if l_prev_month in (1, 3, 5, 7, 8, 10, 12) then
  8       dbms_output.put_line('Do this');
  9    else
 10       dbms_output.put_line('Do that');
 11    end if;
 12  end;
 13  /
Previous month = 12
Do this

PL/SQL procedure successfully completed.

SQL>
  • строка № 4:
    • trunc(sysdate, 'mm') возврат в первый месяц текущего месяца
    • вычитая 1 из него, возвращается последний день предыдущего месяца
    • применить TO_CHAR с маской формата mm, чтобы получить желаемый результат
...