Java 为什么oracle to_date返回此错误ORA-01861:文字与格式字符串不匹配

Java 为什么oracle to_date返回此错误ORA-01861:文字与格式字符串不匹配,java,sql,oracle,talend,Java,Sql,Oracle,Talend,我试图在talend中使用java和SQL,但得到以下错误ORA-01861:文本与格式字符串不匹配 下面是我的java代码: Date supply_date_last_filter = new Date(); Date supply_date_start_filter; supply_date_last_filter = TalendDate.parseDate("ddMMyyyy",TalendDate.formatDate("ddMMyyyy"

我试图在talend中使用java和SQL,但得到以下错误ORA-01861:文本与格式字符串不匹配

下面是我的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"                     
“”“选择子订单(fld_znvaleur,5,3)存储代码、子订单(fld_znvaleur,8,8)订单号、子订单(fld_znvaleur,16,8)订单日期、标准现场、标准现场、wcd_tydem、tyd_typedem”
来自“+context.link\u METIsupply\u DB\u schema+”.mgfld
内部联接“+context.link\u METIsupply\u DB\u schema+”.mgfle
ON(fle_cdflux=fld_cdflux
和fle_notrait=fld_notrait)
左连接“”+context.link\u METIsupply\u DB\u schema+“”.mgwcd
ON(wcd_nocdemag=to_编号(substr(fld_znvaleur,8,8))
和wcd_noclcash=to_编号(substr(fld_znvaleur,5,3)))
左连接“”+context.link\u METIsupply\u DB\u schema+“”.mgstd
ON(wcd_tydemand=std_tydemand,wcd_cdetat=std_cdsitu)
左连接“+context.link\u METIsupply\u DB\u schema+”.mgtyd
ON(tyd_tydemand=wcd_tydemand)
其中fld_cdflux='DDE'
而fld_cdfichier='DDE_E'
和substr(fld_znvaleur,16,8)介于到日期之间(“+((字符串)globalMap.get”(““供应日期”\u开始日期”\u过滤器”)+”,“DDMMYYYY”)
和to_date(“+((字符串)globalMap.get(““supply_date_last_filter_str”))+”,“DDMMYYYY”)
和substr(fld_znvaleur,16,8)'
以及“+context.work\u METIstore\u list”中的substr(fld_znvaleur,5,3)

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

有两种可能,因为您的一些代码没有使用处理日期的最佳实践:

  • 不要将字符串与日期进行比较。将
    substr(fld_znvaleur,16,8)
    包装在
    to_date()调用中
  • supply\u date\u start\u filter
    supply\u date\u last\u filter
    是终止日期对象,但您在SQL查询中将它们强制转换为字符串,而不指定格式掩码。为什么不使用Java代码末尾创建的字符串版本呢
我会将您的代码改写为:

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个字符的子字符串,所有数字)


对于str,这只是复制过去的一个错误,我正在尝试您的日期选项,然后我将返回给您这是我收到的新消息tDBInput_3 ORA-01858:在需要数字的地方发现了一个非数字字符我添加了一个查询以查找表中的无效行,看看这是否有帮助?
select * from mgfld where regexp_instr(substr(fld_znvaleur, 16, 8),'^[0-9]{8}$') = 0;