格式代码出现两次



我在下面的预言机查询中收到以下错误。我没有看到我在查询中给出的格式有问题。我认为这可能与.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
);

用户从 UI 中选择两个日期,该日期以以下格式发送到后端代码"2018 年 9 月 4 日星期二 00:00:00",但 oracle 数据库的日期存储为"2018-09-04 00:00:00.0"。所以我尝试通过以下方式将他们选择的日期转换为该格式:

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

这会将其转换为我需要的格式,但现在它是一个字符串,我相信这给了我问题。

TO_DATE转换为日期,而不是时间戳。

在 Oracle 中,日期没有几分之一秒。您要创建的是时间戳;为此,请使用TO_TIMESTAMP。

完成后,你将得到同样的错误;要指示秒的分数,请使用.ff,而不是.sss。 (注意:两个f,而不是三个!

在 hh 之后,您也缺少 24。 应该'... hh24:mi:ss.ff'

您正在使用参数。 不要将值作为字符串传递 - 使用适当的数据类型:

SELECT *   
FROM (SELECT cr.*   
FROM comprater_requests cr
WHERE spname = ? AND
effectivedate >= ? AND
effectivedate <= ?
) cr 
WHERE ROWNUM <= 100 ;

我实际上想通了这个问题。

存储在 oracle 数据库中的日期与传递到查询中以执行搜索的格式不同。因此,我将参数的格式更改为"YYYY-MM-DD"格式的字符串,然后用TO_CHAR更改了VALIDDATE的格式。所以我的查询如下所示:

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

最新更新