PL / SQL и интервалы дат - PullRequest
2 голосов
/ 05 ноября 2010

У меня есть дата, и я хочу напечатать смещение от этой даты.Я могу сделать это:

dbms_output.put_line(to_char(g_startDate - interval '4' month ,'YYYY-MM-DD'));

, и он отлично работает.Проблема в том, что интервал является переменным.Когда я пытаюсь это:

dbms_output.put_line(to_char(g_startDate - interval g_dateOffsetAmt month ,'YYYY-MM-DD'));

Я получаю ошибку компилятора.

Я думал, что это может быть, потому что g_dateOffsetAmt это integer, поэтому я попытался это:*

Хотя я все еще получаю ошибки компилятора, говорящие:


Error: PLS-00103: Encountered the symbol "TO_CHAR" when expecting one of the following:

          . ) , * @ & | = - +  at in is mod remainder not rem =>
          ..   or != or ~= >=  and or like
          LIKE2_ LIKE4_ LIKEC_ as between from using || member
           SUBMULTISET_
       The symbol "," was substituted for "TO_CHAR" to continue.
Line: 704

Error: PLS-00103: Encountered the symbol "MONTH" when expecting one of the following:

          . ( ) , * % & | = - +  at in is mod remainder not range
          rem => ..   or != or ~= >=  and or
          like LIKE2_ LIKE4_ LIKEC_ between || multiset member
          SUBMULTISET_
       The symbol "." was substituted for "MONTH" to continue.
Line: 704

Есть ли другой способ сделать это?

Ответы [ 2 ]

6 голосов
/ 05 ноября 2010

Возможно, вы захотите использовать функцию NumToYMInterval

declare
  v_interval pls_integer := 4;
begin
  dbms_output.put_line( sysdate - NumToYMInterval( v_interval, 'month' ) );
end;
/
3 голосов
/ 05 ноября 2010

Есть несколько способов сделать это. Либо введите вашу переменную, переданную в качестве интервала, либо используйте вместо нее функцию add_months:

declare
    v_interval INTERVAL YEAR TO MONTH := interval '4' month;
begin
    dbms_output.put_line(to_char((sysdate - v_interval), 'MM/DD/YYYY'));
end; 

declare
    v_interval PLS_INTEGER := 4;
begin
    dbms_output.put_line(to_char(add_months(sysdate, -v_interval), 'MM/DD/YYYY'));
end; 
...