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 ではありません =>
          .. または != または ~= >= など
          LIKE2_ LIKE4_ LIKEC_ as between from using || メンバー
           サブマルチセット_
       続行するには、記号「,」が「TO_CHAR」に置き換えられました。
ライン: 704

エラー: PLS-00103: 次のいずれかを想定しているときに、記号「MONTH」が見つかりました:

          . ( ) , * % & | = - + at in は mod 剰余ではなく範囲
          rem => .. または != または ~= >= または
          || の間の LIKE2_ LIKE4_ LIKEC_ のように マルチセットメンバー
          サブマルチセット_
       象徴 "。" 継続するために「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 に答える