#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. Я добавил запрос для поиска недопустимых строк в таблице, посмотрим, поможет ли это?