无效的月SQL

无效的月SQL,sql,oracle,plsql,oracle9i,Sql,Oracle,Plsql,Oracle9i,当我运行此查询时,发现格式错误 如何纠正这一点?我试图给出不同的日期选项,这说明了一些。 请建议假设问题标题意味着你得到了ORA-01843:不是有效的月份,这可能是由于你不必要的到日期()调用为一匹没有名字的马,但这取决于你的NLS\u日期格式设置。这很容易复制,但只能通过对您的环境进行假设: for rate in ( select tgt.carrier_code, tgt.tc_code, tgt.exp_date, (TO_date(src.eff_date,'DD/MM/R

当我运行此查询时,发现格式错误

如何纠正这一点?我试图给出不同的日期选项,这说明了一些。
请建议

假设问题标题意味着你得到了
ORA-01843:不是有效的月份
,这可能是由于你不必要的
到日期()
调用为一匹没有名字的马,但这取决于你的
NLS\u日期格式
设置。这很容易复制,但只能通过对您的环境进行假设:

     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;
其中:

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
隐式转换将其呈现为
01/28/2013
(或者,如果时间在NLS日期掩码中,也可以是时间),然后当您尝试使用掩码将其转换回日期
DD/MM/RRRR…
时,它尝试使用“28”作为月份,这显然是无效的

如果您的字段已经是日期,那么您的
to_date()
调用是毫无意义的,容易混淆,在这种情况下会导致错误。您应该能够做到:

select to_date(to_char(sysdate, 'MM/DD/RRRR'), 'DD/MM/RRRR HH24:MI:SS')
我将您的
-1/(24*60*60)
更改为
-interval'1'秒
,因为我发现这更清晰,但效果相同


您的更新没有
where
子句,但是因为它缺少
可能在转录过程中丢失的数据。

什么数据类型是
rate.eff_date
?如果它已经是一个
日期
,那么绝对没有理由在它上面应用
到\u DATE()
。@a\u horse\u没有名称:如果我删除它,它只是一个日期evn,表示格式错误。你能编辑查询吗?我试过了,它说错误,它说错误不是有效的Oracle错误消息。
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;