Код формата появляется дважды

Я получаю следующую ошибку в запросе оракула ниже. Я не вижу проблемы с форматом, который я даю в запросе. Я думаю, что это может иметь отношение к.SSS, но я не уверен:

SELECT
     *   
 FROM
     (   
         SELECT
             *   
         FROM
             comprater_requests
         WHERE
             spname =?
             AND effectivedate >= TO_DATE(?,'yyyy-MM-dd HH:mi:ss.SSS')
             AND effectivedate <= TO_DATE(?,'yyyy-MM-dd HH:mi:ss.SSS')
     )   
 WHERE
     ROWNUM <= 100 

Ошибка:

ORA-01810: format code appears twice

Параметры:

Parameters: [Google, 2018-07-24 00:00:00.000, 2018-09-06 00:00:00.000]

Таблица:

    CREATE TABLE COMPRATER_REQUESTS
(
  ID                    NUMBER DEFAULT COMP_RATER_SEQ.NEXTVAL PRIMARY KEY,
  TRANSACTIONID         VARCHAR2(20 BYTE) NOT NULL,
  QUOTE                 CLOB,
  ARCHIVEXML            CLOB,
  ADDITIONALINFO        CLOB,
  QUOTEID               VARCHAR2(20 BYTE),
  AGENTID               CHAR(50 BYTE),
  EFFECTIVEDATE         DATE
);

Пользователь выбирает две даты в пользовательском интерфейсе, который отправляется на внутренний код в следующем формате: "Tue Sep 04 00:00:00 EDT 2018", но в базе данных Oracle есть даты, сохраненные как "2018-09-04 00:00".: 00,0. Поэтому я попытался преобразовать дату, которую они выбрали, в этот формат, выполнив:

 dateFormat = new SimpleDateFormat(CompRaterPropertiesML.ACORD_DB_DATE_FORMAT)
 fromDateFormat = dateFormat.format(selectedDate1)
 toDateFormat = dateFormat.format(selectedDate2)

Это преобразует его в формат, который мне нужен, но теперь это строка, которая, как мне кажется, дает мне проблему.

3 ответа

Решение

Я на самом деле понял проблему.

Дата, которая была сохранена в базе данных Oracle, отличалась от формата, который передавался в запрос для выполнения поиска. Поэтому я изменил формат параметров на строку в формате "ГГГГ-ММ-ДД", а затем изменил формат EFFECTIVEDATE с помощью TO_CHAR. Итак, мой запрос выглядит следующим образом:

SELECT * FROM ( SELECT * FROM COMPRATER_REQUESTS WHERE SPNAME = ? AND TO_CHAR(EFFECTIVEDATE,'yyyy-mm-dd') >= ? AND TO_CHAR(EFFECTIVEDATE,'yyyy-mm-dd') <= ? ) WHERE ROWNUM <= 100

TO_DATE преобразуется в дату, а не в метку времени.

В Oracle даты не имеют доли секунды. То, что вы хотите создать, это временные метки; для этого используйте TO_TIMESTAMP.

После этого вы получите ту же ошибку; чтобы указать доли секунды, используйте .ffне .sss, (ПРИМЕЧАНИЕ: два ф, а не три!)

Вам также не хватает 24 после чч. Должно быть '... hh24:mi:ss.ff'

Вы используете параметры. Не передавайте значения в виде строк - используйте соответствующий тип данных:

SELECT *   
FROM (SELECT cr.*   
      FROM comprater_requests cr
      WHERE spname = ? AND
            effectivedate >= ? AND
            effectivedate <= ?
     ) cr 
 WHERE ROWNUM <= 100 ;
Другие вопросы по тегам