我在下面的oracle查询中遇到以下错误。我在查询中没有看到格式问题。我认为这可能与.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 DB的日期存储为“ 2018-09-04” 00:00:00.0'。因此,我尝试通过以下操作将他们选择的日期转换为该格式:
dateFormat = new SimpleDateFormat(CompRaterPropertiesML.ACORD_DB_DATE_FORMAT)
fromDateFormat = dateFormat.format(selectedDate1)
toDateFormat = dateFormat.format(selectedDate2)
这会将其转换为我需要的格式,但是现在它是一个字符串,我相信这给了我问题。
答案 0 :(得分:2)
TO_DATE转换为日期,而不是时间戳。
在Oracle中,日期没有几分之一秒。您要创建的是时间戳记;为此,请使用TO_TIMESTAMP。
这样做之后,您将得到相同的错误;要表示几分之一秒,请使用.ff
,而不要使用.sss
。 (注意:两个f,而不是三个!)
hh之后,您还缺少24。应该是'... hh24:mi:ss.ff'
答案 1 :(得分:1)
您正在使用参数。不要将值作为字符串传递-使用适当的数据类型:
SELECT *
FROM (SELECT cr.*
FROM comprater_requests cr
WHERE spname = ? AND
effectivedate >= ? AND
effectivedate <= ?
) cr
WHERE ROWNUM <= 100 ;
答案 2 :(得分:0)
我实际上发现了问题。
Oracle数据库中存储的日期与传递给查询以执行搜索的格式不同。因此,我将参数的格式更改为“ YYYY-MM-DD”格式的字符串,然后使用TO_CHAR更改了EFFECTIVEDATE的格式。所以我的查询如下所示:
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