-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;

当我运行此查询时,我收到格式错误。

如何纠正这个?我想给 diff to_date 选项它说一些。请建议

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 回答