为啥我的 oracle to_date 返回此错误 ORA-01861: literal does not match format string

Posted

技术标签:

【中文标题】为啥我的 oracle to_date 返回此错误 ORA-01861: literal does not match format string【英文标题】:Why my oracle to_date is returning this error ORA-01861: literal does not match format string为什么我的 oracle to_date 返回此错误 ORA-01861: literal does not match format string 【发布时间】:2020-11-16 16:48:01 【问题描述】:

我正在尝试在 talend 中使用 java 和 SQL,但收到以下错误 ORA-01861: literal does not match format string

这里是我的java代码:

Date supply_date_last_filter =  new Date();

Date supply_date_start_filter;

supply_date_last_filter = TalendDate.parseDate("ddMMyyyy",TalendDate.formatDate("ddMMyyyy", new Date()));

if (context.work_METI_last_date != null && !"".equals(context.work_METI_last_date)) 
     supply_date_last_filter = TalendDate.parseDate("ddMMyyyy",context.work_METI_last_date);


supply_date_start_filter = TalendDate.addDate(supply_date_last_filter, - Integer.parseInt(context.work_METIstore_last_days), "dd");

String supply_date_start_filter_str = TalendDate.formatDate("ddMMyyyy",supply_date_start_filter);

String supply_date_last_filter_str = TalendDate.formatDate("ddMMyyyy",supply_date_last_filter);

这里是我在 Talend 中使用的 SQL 代码:

"""SELECT substr(fld_znvaleur, 5, 3) store_code, substr(fld_znvaleur, 8, 8) order_number, substr(fld_znvaleur, 16, 8) order_date, std_cdsitu, std_lbsitu, wcd_tydemand, tyd_lbtypdem
FROM "" + context.link_METIsupply_DB_schema + "".mgfld
INNER JOIN "" + context.link_METIsupply_DB_schema + "".mgfle
    ON (fle_cdflux = fld_cdflux
    AND fle_notrait = fld_notrait)
LEFT JOIN "" + context.link_METIsupply_DB_schema + "".mgwcd
    ON (wcd_nocdemag = to_number(substr(fld_znvaleur, 8, 8))
    AND wcd_noclcash = to_number(substr(fld_znvaleur, 5, 3)))
LEFT JOIN  "" + context.link_METIsupply_DB_schema + "".mgstd
    ON (wcd_tydemand = std_tydemand and wcd_cdetat = std_cdsitu)
LEFT JOIN  "" + context.link_METIsupply_DB_schema + "".mgtyd
    ON (tyd_tydemand = wcd_tydemand)
WHERE fld_cdflux = 'DDE'
  AND fld_cdfichier = 'DDE_E'
  AND substr(fld_znvaleur, 16, 8) BETWEEN to_date('"" + ((String) globalMap.get(""supply_date_start_filter_str"")) + ""','DDMMYYYY')
    AND to_date('"" + ((String) globalMap.get(""supply_date_last_filter_str"")) + ""','DDMMYYYY')
and substr(fld_znvaleur, 16, 8) <> '        '
AND substr(fld_znvaleur, 5, 3) in "" + context.work_METIstore_list"                     

【问题讨论】:

【参考方案1】:

此错误表示 Oracle 无法使用“DDMMYYYY”将您提供的字符串转换为日期。

有两种可能性,因为您的某些代码没有使用处理日期的最佳做法:

不要将字符串与日期进行比较。将substr(fld_znvaleur, 16, 8) 封装在to_date() 调用中。 supply_date_start_filtersupply_date_last_filter 是 Talend Date 对象,但您在 SQL 查询中将它们转换为 String,而没有指定格式掩码。为什么不使用您在 Java 代码末尾创建的 String 版本?

我会将你的代码重写为:

AND to_date(substr(fld_znvaleur, 16, 8),'DDMMYYYY') 
  BETWEEN to_date('"" + ((String) globalMap.get(""supply_date_start_filter_str"")) + ""','DDMMYYYY')
      AND to_date('"" + ((String) globalMap.get(""supply_date_last_filter_str"")) + ""','DDMMYYYY')

如果这不能解决问题,您的表中可能会有意外数据。看看这个查询本身是否会导致错误:

select * from mgfld where to_date(substr(fld_znvaleur, 16, 8),'DDMMYYYY') = sysdate;

编辑:您可以尝试使用此查询来查找 mgfld 中违反您期望的行(8 个字符的子字符串,所有数字)。

select * from mgfld where regexp_instr(substr(fld_znvaleur, 16, 8),'^[0-9]8$') = 0;

【讨论】:

对于 str 这只是复制过去的错误,我正在尝试你的 to_date 选项,我会回到你身边 这是我收到的新消息 tDBInput_3 ORA-01858:在预期有数字的地方发现了一个非数字字符 我添加了一个查询来查找表中的无效行,看看是否有帮助?

以上是关于为啥我的 oracle to_date 返回此错误 ORA-01861: literal does not match format string的主要内容,如果未能解决你的问题,请参考以下文章

oracle,插入数据,to_date('13-JUL-87')-51为啥提示“无效的月份”?

转换 to_date 时为啥此查询不失败

为啥 ORACLE TO_DATE() 函数可以接收任何日期格式? [复制]

Oracle to_date() 输出错误

为啥我的终端返回此 s3 错误?

为啥 Apex/Oracle 会出现此错误?