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

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

你好,我试图在talend中使用java和sql,我得到了以下错误ora-01861:literal与format string不匹配
下面是我的java代码:

  1. Date supply_date_last_filter = new Date();
  2. Date supply_date_start_filter;
  3. supply_date_last_filter = TalendDate.parseDate("ddMMyyyy",TalendDate.formatDate("ddMMyyyy", new Date()));
  4. if (context.work_METI_last_date != null && !"".equals(context.work_METI_last_date)) {
  5. supply_date_last_filter = TalendDate.parseDate("ddMMyyyy",context.work_METI_last_date);
  6. }
  7. supply_date_start_filter = TalendDate.addDate(supply_date_last_filter, - Integer.parseInt(context.work_METIstore_last_days), "dd");
  8. String supply_date_start_filter_str = TalendDate.formatDate("ddMMyyyy",supply_date_start_filter);
  9. String supply_date_last_filter_str = TalendDate.formatDate("ddMMyyyy",supply_date_last_filter);

下面是我在talend中使用的sql代码:

  1. """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
  2. FROM "" + context.link_METIsupply_DB_schema + "".mgfld
  3. INNER JOIN "" + context.link_METIsupply_DB_schema + "".mgfle
  4. ON (fle_cdflux = fld_cdflux
  5. AND fle_notrait = fld_notrait)
  6. LEFT JOIN "" + context.link_METIsupply_DB_schema + "".mgwcd
  7. ON (wcd_nocdemag = to_number(substr(fld_znvaleur, 8, 8))
  8. AND wcd_noclcash = to_number(substr(fld_znvaleur, 5, 3)))
  9. LEFT JOIN "" + context.link_METIsupply_DB_schema + "".mgstd
  10. ON (wcd_tydemand = std_tydemand and wcd_cdetat = std_cdsitu)
  11. LEFT JOIN "" + context.link_METIsupply_DB_schema + "".mgtyd
  12. ON (tyd_tydemand = wcd_tydemand)
  13. WHERE fld_cdflux = 'DDE'
  14. AND fld_cdfichier = 'DDE_E'
  15. AND substr(fld_znvaleur, 16, 8) BETWEEN to_date('"" + ((String) globalMap.get(""supply_date_start_filter_str"")) + ""','DDMMYYYY')
  16. AND to_date('"" + ((String) globalMap.get(""supply_date_last_filter_str"")) + ""','DDMMYYYY')
  17. and substr(fld_znvaleur, 16, 8) <> ' '
  18. 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代码末尾创建的字符串版本呢?
我会把你的代码改写为:

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

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

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

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

  1. select * from mgfld where regexp_instr(substr(fld_znvaleur, 16, 8),'^[0-9]{8}$') = 0;
展开查看全部

相关问题