你好,我试图在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"
1条答案
按热度按时间zed5wv101#
此错误意味着oracle无法使用“ddmmyyyy”将您提供的字符串转换为日期。
有两种可能,因为有些代码不使用处理日期的最佳实践:
不要把字符串和日期作比较。包裹
substr(fld_znvaleur, 16, 8)
在一个to_date()
打电话。supply_date_start_filter
以及supply_date_last_filter
是talend date对象,但在sql查询中将它们强制转换为字符串,而不指定格式掩码。为什么不使用java代码末尾创建的字符串版本呢?我会把你的代码改写为:
如果这不能解决问题,表中可能会有意外的数据。查看此查询是否自行导致错误:
编辑:您可以尝试此查询在中查找行
mgfld
这违反了您的期望(8个字符的子字符串,所有数字)。