为啥我的 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_filter
和 supply_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为啥提示“无效的月份”?