【问题标题】:java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input string (Oracle)java.sql.SQLDataException: ORA-01830: 日期格式图片在转换整个输入字符串之前结束 (Oracle)
【发布时间】:2020-06-24 05:33:17
【问题描述】:

我正在尝试通过 Java 代码运行脚本

query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
       "WHERE TO_DATE(CREATEDATE, 'DD-MM-RR') = TO_DATE('26-NOV-19', 'DD-MM-RR')\";");
stmt = con.prepareStatement(query.toString());
rs = stmt.executeQuery();

当尝试在 Oracle SQL Developer 中运行脚本时,它运行良好,但是当运行我的 java 代码时,它给出了 SQLDataException:

java.sql.SQLDataException: ORA-01830: date format picture ends before converting entire input   string

at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:440)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:445)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:523)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:863)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1153)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1275)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3576)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3620)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)

我找不到导致错误的原因,请问有人吗?谢谢

【问题讨论】:

    标签: oracle date


    【解决方案1】:

    你的caluse应该是什么样子-

    WHERE TO_DATE(CREATEDATE, 'DD-MM-RR') = TO_DATE('26-11-19', 'DD-MM-RR')
    

    【讨论】:

      【解决方案2】:

      我不认为你需要TO_DATE 来代替CREATEDATE,因为它已经是一个约会了。

      另外,你的TO_DATE('26-NOV-19', 'DD-MM-RR') 应该是TO_DATE('26-NOV-19', 'DD-MON-RR')

      试试这个:

      SELECT
          CNAME,
          CREATEDATE
      FROM
          MERGE_DATA_VW
      WHERE
          TRUNC(CREATEDATE) = TO_DATE('26-NOV-19', 'DD-MON-RR');
      

      干杯!!

      【讨论】:

      • 其实应该是to_date('26-NOV-2019', 'DD-MON-YYYY')。现在是 2020 年,没有任何借口仍然使用千禧年前的解决方法来解决 Y2K 错误。或者只使用 ASCII 日期文字 date '2019-11-26'.
      【解决方案3】:

      假设CREATEDATEDATE 数据类型的列,那么您不需要在其上使用TO_DATE(因为它已经是DATE),您也不需要尾随@987654325 @。

      您也可以使用日期文字。

      所以假设CREATEDATE 总是有一个深夜时间组件:

      query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
             "WHERE CREATEDATE = DATE '2019-11-26'");
      
      

      如果您的CREATEDATE 列具有非午夜时间部分,那么您需要在一个范围内进行比较(或使用TRUNC,但这将不允许您在该列上使用索引并且需要一个单独的函数-基于索引):

      query.append("SELECT CNAME,CREATEDATE  FROM MERGE_DATA_VW \r\n" + 
             "WHERE CREATEDATE >= DATE '2019-11-26' AND CREATEDATE < DATE '2019-11-27'");
      
      

      【讨论】:

        【解决方案4】:

        日期格式错误

        TO_DATE('26-NOV-19', 'DD-MM-RR')
        

        请用户更正日期

        ie 'DD-MON-RR' FOR '26-NOV-19'
        

        【讨论】:

          猜你喜欢
          • 2019-04-25
          • 1970-01-01
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多