3

我在下面的 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
);

用户从 UI 中选择两个日期,这些日期以以下格式发送到后端代码“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)

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

4

3 回答 3

2

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

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

完成后,您将收到相同的错误;要表示秒的分数,请使用.ff,而不是.sss。(注意:两个 f,不是三个!)

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

于 2018-08-24T14:13:44.723 回答
1

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

SELECT *   
FROM (SELECT cr.*   
      FROM comprater_requests cr
      WHERE spname = ? AND
            effectivedate >= ? AND
            effectivedate <= ?
     ) cr 
 WHERE ROWNUM <= 100 ;
于 2018-08-24T14:30:33.177 回答
0

我实际上弄清楚了这个问题。

存储在 oracle DB 中的日期与传递给查询以执行搜索的格式不同。所以我将参数的格式更改为'YYYY-MM-DD'格式的字符串,然后将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
于 2018-08-27T16:10:08.710 回答