【问题标题】:How to select by DATE type in jdbc using oracle DB?如何使用 oracle DB 在 jdbc 中按 DATE 类型进行选择?
【发布时间】:2021-12-02 13:21:28
【问题描述】:

在我的数据库 created_date 数据类型列是 DATE 并且我想使用 ORACLE 数据库在 jdbc 中按 DATE 类型进行选择,但是当我运行此方法时 像这样

Info infos = ExcellWriteToDatabase.readFromDataBase("2021-10-14 09:36:58");

,我收到此错误。如何解决这个问题呢?我尝试了很多东西,但都没有解决。

java.sql.SQLDataException: ORA-01861: literal does not match format string

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:509)
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:461)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1104)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:550)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:268)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:270)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:91)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:970)
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1012)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666)
    at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1426)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3713)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1167)
    at az.expressbank.insertdatabasetheexcellfile.util.ExcellWriteToDatabase.readFromDataBase(ExcellWriteToDatabase.java:106)
    at az.expressbank.insertdatabasetheexcellfile.test.Test.main(Test.java:25)
Caused by: Error : 1861, Position : 65, Sql = SELECT PHONE_NUMBER,TEXT_MESSAGE FROM TEST WHERE CREATED_DATE = :1 , OriginalSql = SELECT PHONE_NUMBER,TEXT_MESSAGE FROM TEST WHERE CREATED_DATE = ?, Error Msg = ORA-01861: literal does not match format string

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:513)
    ... 16 more
null



public static Info readFromDataBase(String createdDate) throws SQLException {
         try {
                    Properties properties = new Properties();
                    properties.setProperty("user", "root");
                    properties.setProperty("password", "password");
                    properties.setProperty("useSSL", "false");
                    properties.setProperty("autoReconnect", "true");
        
                    Class.forName("oracle.jdbc.driver.OracleDriver");
                    Connection connect = DriverManager.getConnection("url", properties);
                    PreparedStatement prepareStatement = connect.prepareStatement("SELECT PHONE_NUMBER,TEXT_MESSAGE FROM TEST WHERE CREATED_DATE = ?");
                    prepareStatement.setString(1, createdDate);
                    ResultSet resultSet = prepareStatement.executeQuery();
                    if (resultSet.next()) {
                        Info info = new Info();
                        info.setPhoneNumber(resultSet.getString(1));
                        info.setCreatedDate(LocalDateTime.parse(resultSet.getString(2), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
                        return info;
                    }
                    connect.close();
                } catch (ClassNotFoundException | SQLException e) {
                    e.printStackTrace();
                }
        
                return null;
                }

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    这里的主要问题是您将 Java String 绑定到 Oracle 查询,而您应该绑定 JDBC 驱动程序可以在查询中转换为正确类型的日期/时间类型。考虑这个版本:

    public static Info readFromDataBase(String createdDate) throws SQLException {
        // ...
    
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime dateTime = LocalDateTime.parse(createdDate, formatter);
        String sql = "SELECT PHONE_NUMBER, TEXT_MESSAGE FROM TEST WHERE CREATED_DATE = ?";
        PreparedStatement ps = connect.prepareStatement(sql);
        ps.setObject(1, dateTime);
        ResultSet resultSet = ps.executeQuery();
        if (resultSet.next()) {
            // process result set
        }
    
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 2012-05-06
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多