【问题标题】: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"                     

【问题讨论】:

    标签: java sql oracle talend


    【解决方案1】:

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

    有两种可能性,因为您的某些代码没有使用处理日期的最佳做法:

    • 不要将字符串与日期进行比较。将substr(fld_znvaleur, 16, 8) 封装在to_date() 调用中。
    • supply_date_start_filtersupply_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:在预期有数字的地方发现了一个非数字字符
    • 我添加了一个查询来查找表中的无效行,看看是否有帮助?
    猜你喜欢
    • 2021-07-12
    • 2019-12-13
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2013-05-14
    • 1970-01-01
    相关资源
    最近更新 更多