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