Код формата появляется дважды - PullRequest
0 голосов
/ 24 августа 2018

Я получаю следующую ошибку при запросе оракула ниже. Я не вижу проблемы с форматом, который я даю в запросе. Я думаю, что это может иметь отношение к .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 ]

0 голосов
/ 24 августа 2018

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

SELECT *   
FROM (SELECT cr.*   
      FROM comprater_requests cr
      WHERE spname = ? AND
            effectivedate >= ? AND
            effectivedate <= ?
     ) cr 
 WHERE ROWNUM <= 100 ;
0 голосов
/ 27 августа 2018

Я действительно выяснил проблему.

Дата, которая была сохранена в базе данных 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
0 голосов
/ 24 августа 2018

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

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

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

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

...