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;
当我运行此查询时,我收到格式错误。
如何纠正?我特意提出了差异to_date选项。 请建议
答案 0 :(得分:1)
假设问题标题意味着您有ORA-01843: not a valid month
,这可能取决于您建议的a_horse_with_no_name不必要的to_date()
来电,但这取决于您的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
子句,但由于缺少可能在转录中丢失的;
。