You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:06:00