2

我有一个日期,我想打印该日期的偏移量。我可以做这个:

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所以我尝试了这个:

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

虽然我仍然收到编译器错误说:

错误:PLS-00103:在预期以下情况之一时遇到符号“TO_CHAR”:

          . ) , * @ & | = - + at in 是 mod 余数不是 rem =>
          .. or != or ~= >= and or like
          LIKE2_ LIKE4_ LIKEC_ 之间使用 || 成员
           SUBMULTISET_
       符号“,”被替换为“TO_CHAR”以继续。
线路:704

错误:PLS-00103:在预期以下情况之一时遇到符号“MONTH”:

          . ( ) , * % & | = - + at in 是 mod 余数不是范围
          rem => .. or != or ~= >= and or
          喜欢LIKE2_LIKE4_LIKEC_之间|| 多集成员
          SUBMULTISET_
       符号“。” 被替换为“MONTH”以继续。
线路:704

还有其他方法可以做到这一点吗?

4

2 回答 2

6

您可能想要使用 NumToYMInterval 函数

declare
  v_interval pls_integer := 4;
begin
  dbms_output.put_line( sysdate - NumToYMInterval( v_interval, 'month' ) );
end;
/
于 2010-11-05T14:20:29.407 回答
3

有几种方法可以做到这一点。要么键入要作为间隔传入的变量,要么使用函数 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; 
于 2010-11-05T14:14:45.317 回答