我需要将包含日期的字符串转换为日期数据类型字段。有时字符串格式为 yyyy-mm-dd hh 24:mi:ss(FA),有时格式为 dd/mm/yyyy hh 24:mi:ss(FB)。我正在使用一小段代码来测试,拦截和管理ORA-01861,但我面临着一个意想不到的问题。我试着解释。
declare
s varchar2(100) := '2023-02-24 14:22:49';
f varchar2(100) := null;
f1 varchar2(100) := 'yyyy-mm-dd hh24:mi:ss';
f2 varchar2(100) := 'dd/mm/yyyy hh24:mi:ss';
d date := null;
begin
f := f1;
d := to_date(s,f);
dbms_output.put_line(f||' --> '||d);
f := f2;
d := to_date(s,f);
dbms_output.put_line(f||' --> '||d);
exception
when others then
dbms_output.put_line(s||' --> '||f||' >>>> '||sqlerrm);
end;
我所期望的是,改变S的格式,由于不匹配的格式而引发异常,在第一个例子中,这就是正在发生的事情。输出为:
yyyy-mm-dd hh24:mi:ss --> 24-FEB-23
2023-02-24 14:22:49 --> dd/mm/yyyy hh24:mi:ss >>>> ORA-01861: literal does not match format string
但是如果我像这样改变值:
declare
s varchar2(100) := '05/03/2023 08:44';
f varchar2(100) := null;
f1 varchar2(100) := 'yyyy-mm-dd hh24:mi:ss';
f2 varchar2(100) := 'dd/mm/yyyy hh24:mi:ss';
d date := null;
begin
f := f1;
d := to_date(s,f);
dbms_output.put_line(f||' --> '||d);
f := f2;
d := to_date(s,f);
dbms_output.put_line(f||' --> '||d);
exception
when others then
dbms_output.put_line(s||' --> '||f||' >>>> '||sqlerrm);
end;
没有异常,输出为:
yyyy-mm-dd hh24:mi:ss --> 20-MAR-05
dd/mm/yyyy hh24:mi:ss --> 05-MAR-23
我对解决方案、变通方法等感到好奇。
1条答案
按热度按时间pb3s4cty1#
当您这样做时:
然后生成的日期是
0005-03-20 23:08:44
。这是因为:
yyyy
匹配05
(给出公元5年)-
还匹配/
(因为字符串到日期的转换规则规定“您可以在日期字符串中使用任何非字母数字字符来匹配格式字符串中的标点符号。”)mm
匹配03
-
也匹配/
dd
匹配20
hh24
匹配23
:
mi
匹配08
;和:
匹配ss
匹配44
。如果你想引发一个异常,那么使用
fx
模型的精确匹配:你会得到一个异常:
fiddle