Почему мой oracle to_date возвращает эту ошибку ORA-01861: литерал не соответствует строке формата

#java #sql #oracle #talend

#java #sql #Oracle #talend

Вопрос:

Я пытаюсь использовать java и SQL в talend и получаю следующую ошибку 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 amp;amp; !"".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);
  

и вот мой SQL-код, который я использую в Talend:

 """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:

Эта ошибка означает, что Oracle не удалось преобразовать заданную вами строку в дату, используя «DDMMYYYY».

Есть 2 возможности, поскольку в некоторых ваших кодах не используются рекомендации по работе с датами:

  • Не сравнивайте строки с датами. Завершите 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;
  

Комментарии:

1. для str это просто ошибка копирования прошлого, я пробую ваши параметры to_date и возвращаюсь к вам

2. это новое сообщение, которое у меня есть tDBInput_3 ORA-01858: нечисловой символ был найден там, где ожидалось числовое значение

3. Я добавил запрос для поиска недопустимых строк в таблице, посмотрим, поможет ли это?