-1
     for rate in ( select tgt.carrier_code, tgt.tc_code, tgt.exp_date, (TO_date(src.eff_date,'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date from mira_rate
    tgt, mira_rate_dummy src
    where src.carrier_code=tgt.carrier_code and src.tc_code=tgt.tc_code)
    loop
    update mira_rate
    set exp_date=to_date(rate.eff_date,'DD/MM/RRRR HH24:MI:SS')
end loop;

このクエリを実行すると、フォーマットエラーが発生します。

これを修正する方法は?私はdiffto_dateオプションを与えることを恐れています。plsは提案します

4

1 に答える 1

1

質問のタイトルがあなたが得たことを意味すると仮定するとORA-01843: not a valid month、これはおそらくto_date()a_horse_with_no_nameが示唆したように不要な呼び出しにかかっていますが、NLS_DATE_FORMAT設定によって異なります. 再現するのは簡単ですが、環境について仮定するだけです。

alter session set nls_date_format = 'MM/DD/RRRR';

select to_date(eff_date, 'DD/MM/RRRR HH24:MI:SS') from (
    select (to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date
    from dual
);

与える:

        select (to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') - 1/(24*60*60)) eff_date
                        *
ERROR at line 2:
ORA-01843: not a valid month

または、エラーが内部選択を指しているため、次のようにします。

SQL> select to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') from dual;
select to_date(sysdate, 'DD/MM/RRRR HH24:MI:SS') from dual
               *
ERROR at line 1:
ORA-01843: not a valid month

問題は、日付の暗黙的な変換を行っていることです。効果的に:

select to_date(to_char(sysdate, 'MM/DD/RRRR'), 'DD/MM/RRRR HH24:MI:SS')

暗黙的な変換はそれを01/28/2013(または、NLS 日付マスクにある場合DD/MM/RRRR ...は時間と共に) レンダリングし、それをマスク付きの日付に変換しようとすると、月として「28」を使用しようとします。明らかに無効です。

フィールドがすでに日付である場合、to_date()呼び出しは無意味で混乱を招き、この場合はエラーが発生します。あなたはできるはずです:

for rate in (select tgt.carrier_code, tgt.tc_code, tgt.exp_date,
    src.eff_date - interval '1' second as eff_date
    from mira_rate tgt, mira_rate_dummy src
    where src.carrier_code=tgt.carrier_code and src.tc_code=tgt.tc_code)
    loop
        update mira_rate
        set exp_date = rate.eff_date;
end loop;

より明確だと思うので、あなた- 1/(24*60*60)をに変更しましたが、同じ効果があります。- interval '1' second

whereただし、更新には句がありませんが、欠落し;ていたため、転記で失われた可能性があります。

于 2013-01-28T12:58:11.750 に答える