01861:literal与格式字符串不匹配

r9f1avp5  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(373)

你好,我试图在talend中使用java和sql,我得到了以下错误ora-01861:literal与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"
zed5wv10

zed5wv101#

此错误意味着oracle无法使用“ddmmyyyy”将您提供的字符串转换为日期。
有两种可能,因为有些代码不使用处理日期的最佳实践:
不要把字符串和日期作比较。包裹 substr(fld_znvaleur, 16, 8) 在一个 to_date() 打电话。 supply_date_start_filter 以及 supply_date_last_filter 是talend date对象,但在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个字符的子字符串,所有数字)。

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

相关问题