Oracle to date raise ORA-01861:文字与格式字符串不匹配

1u4esq0p  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(115)

我需要将包含日期的字符串转换为日期数据类型字段。有时字符串格式为 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

我对解决方案、变通方法等感到好奇。

pb3s4cty

pb3s4cty1#

当您这样做时:

TO_DATE('05/03/2023 08:44', 'yyyy-mm-dd hh24:mi:ss')

然后生成的日期是0005-03-20 23:08:44
这是因为:

  • yyyy匹配05(给出公元5年)
  • -还匹配/(因为字符串到日期的转换规则规定“您可以在日期字符串中使用任何非字母数字字符来匹配格式字符串中的标点符号。”)
  • mm匹配03
  • -也匹配/
  • dd匹配20
  • 缺少空格的情况将被忽略
  • hh24匹配23
  • 忽略多余的空格,并忽略缺少:
  • mi匹配08;和
  • :匹配
  • ss匹配44

如果你想引发一个异常,那么使用fx模型的精确匹配:

TO_DATE('05/03/2023 08:44', 'fxyyyy-mm-dd hh24:mi:ss')

你会得到一个异常:

ORA-01862: the numeric value does not match the length of the format item

fiddle

相关问题