java.sql.SQLException: ORA-01843: недопустимая ошибка месяца - проблема преобразования формата даты - PullRequest
0 голосов
/ 22 февраля 2019

У меня странная проблема с запросом, из которого я пытаюсь получить данные, запрашиваемые по параметрам начальной и конечной даты.

Я выполняю следующее.

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
String preparedQuery = "SELECT ID, FULNAME, FRMEMAIL,    LOCATION,TYPE1,TYPE2,BORROWER_NAME,LOAN_NUM,TIME_REQ
FROM FORM_REDUCVU WHERE to_date(TIME_REQ,'yyyy-mm-dd') >= ?  AND to_date (TIME_REQ,'yyyy-mm-dd') <= ? ORDER BY ID DESC";
java.util.Date util_StartDate = sdf.parse( request.getParameter("time_req_date") );
java.sql.Date timreq_datevar1 = new java.sql.Date( util_StartDate.getTime() );
java.util.Date util_EndDate = sdf.parse( request.getParameter("time_req_date2") );
java.sql.Date timreq_datevar2 = new java.sql.Date( util_EndDate.getTime() );
out.println("datestamp java time vals "+timreq_datevar1 + " " + timreq_datevar2);
PreparedStatement prepstmt = connection.prepareStatement(preparedQuery);
prepstmt.setDate(1, timreq_datevar1);
prepstmt.setDate(2, timreq_datevar2);

А значения out.print будут примерно такими, как 2018-10-09 и 2019-02-20.Это соответствует выбранным мной настройкам выбора даты в формате мм / дд / гггг, т.е. 10/09/2018 и 02/20/2019.

Теперь приведенное выше не возвращает ошибок в журнале, но данных тоже нет.Но у меня был SQL-запрос «WHERE to_datechar(TIME_REQ,'mm/dd/yyyy') >= ? AND to_char(TIME_REQ,'mm/dd/yyyy') <= ?

. При переходе к описанному выше я получаю сообщение об ошибке в теме о недопустимом месяце.

Я бы подумал, что класс SimpleDateFormatмог бы проанализировать дату в формате mm / dd / yyyy в шаблоне, но кажется, что шаблон объекта java.slq.Date переносится, как yyyy-mm-dd.

Не правильно ли я его анализирую? Илиэто потребует другого класса или пакета, например, java.Time? Я бы подумал, что это сработает, но должен быть какой-то небольшой метод конвертации, который не работает. Итог - я бы действительно предпочел, чтобы jQuery выбирал даты сих форматы mm / dd / yyyy в такте и могут запрашивать эти записи. Любые комментарии по этому поводу приветствуются. Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Do NOT используйте to_date() для столбца, который уже содержит DATE *. 1004 * преобразует дату в varchar, просто чтобы преобразовать ее обратно в DATE, с которой она должна была начинаться.

Итак, ваше условие должно быть:

WHERE TIME_REQ >= ?  AND TIME_REQ <= ?

Вы правильно используете setDate(), поэтому Oracle выполняет сравнение даты с датой - нет необходимости преобразовывать дату в базе данных встроковое значение.

В идеале вы должны использовать java.time.LocalDate и setObject() вместо java.sql.Date, хотя (однако не все версии драйверов Oracle поддерживают это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...