如何在JDBC中查询Oracle数据库DATE类型字段的匹配数据
问题原因
你遇到的ORA-01861: 文字与格式字符串不匹配报错,核心原因是你直接用setString()给Oracle的DATE类型字段传字符串参数,Oracle会默认按照数据库实例的NLS_DATE_FORMAT配置将字符串隐式转换为DATE类型,你传入的2021-10-14 09:36:58格式和Oracle默认的日期格式不匹配,因此转换失败。
同时你原有代码还存在一个逻辑bug:查询SQL只返回了PHONE_NUMBER、TEXT_MESSAGE两个字段,结果集处理时却取第二列作为CREATED_DATE赋值,逻辑完全不对应。
解决方案
方案1:使用日期类型绑定参数(最推荐)
不要将日期入参作为字符串处理,先将字符串转为Java日期类型后再绑定参数,完全避免隐式转换问题,兼容性最高,不依赖数据库配置。
修改后的代码如下:
public static Info readFromDataBase(String createdDate) throws SQLException { // 日期格式提前定义为常量更规范 DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 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); // 查询SQL添加CREATED_DATE字段,满足后续赋值需求 PreparedStatement prepareStatement = connect.prepareStatement("SELECT PHONE_NUMBER,TEXT_MESSAGE,CREATED_DATE FROM TEST WHERE CREATED_DATE = ?"); // 先将字符串入参转为LocalDateTime LocalDateTime dateTime = LocalDateTime.parse(createdDate, DATE_FORMAT); // 绑定Timestamp类型参数,不要用setString传日期 prepareStatement.setTimestamp(1, Timestamp.valueOf(dateTime)); ResultSet resultSet = prepareStatement.executeQuery(); if (resultSet.next()) { Info info = new Info(); info.setPhoneNumber(resultSet.getString(1)); info.setTextMessage(resultSet.getString(2)); // 直接从结果集取时间类型转LocalDateTime,避免getString的格式问题 info.setCreatedDate(resultSet.getTimestamp(3).toLocalDateTime()); return info; } // 手动关闭资源,建议后续改用try-with-resources语法自动释放更可靠 resultSet.close(); prepareStatement.close(); connect.close(); } catch (ClassNotFoundException | SQLException | DateTimeParseException e) { e.printStackTrace(); } return null; }
方案2:SQL中显式指定日期转换格式
如果一定要用字符串传参,可以在SQL中用Oracle的TO_DATE函数手动指定和入参一致的转换格式,避免依赖数据库默认配置:
// 仅需修改PreparedStatement的SQL定义,参数绑定可以继续用setString PreparedStatement prepareStatement = connect.prepareStatement("SELECT PHONE_NUMBER,TEXT_MESSAGE,CREATED_DATE FROM TEST WHERE CREATED_DATE = TO_DATE(?, 'yyyy-mm-dd hh24:mi:ss')"); prepareStatement.setString(1, createdDate);
内容的提问来源于stack exchange,提问作者iwritecomeinmymind
相关产品推荐
相关产品推荐

