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

Oracle DB JDBC:如何让日期函数返回JDBC标准java.sql.*类型?

让Oracle JDBC返回标准java.sql.*类型的解决方案

遇到Oracle JDBC返回非标准类型的情况确实挺头疼的,我之前也碰到过类似问题,下面给你两个可行的解决思路:

一、通过JDBC连接属性全局配置

这是最省心的方式,一次性解决所有对应类型的映射问题:

1. 让current_date返回java.sql.Date

Oracle JDBC默认会把数据库的DATE类型映射为java.sql.Timestamp(因为Oracle的DATE包含时分秒信息),要改回标准的java.sql.Date,只需要在连接时添加属性:

  • 如果是JDBC URL,直接追加参数:
    jdbc:oracle:thin:@//your-db-host:port/serviceName?oracle.jdbc.mapDateToTimestamp=false
    
  • 如果是用Properties对象配置连接:
    Properties props = new Properties();
    props.setProperty("user", "your-username");
    props.setProperty("password", "your-password");
    props.setProperty("oracle.jdbc.mapDateToTimestamp", "false");
    Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//your-db-host:port/serviceName", props);
    

配置完成后,执行select current_date from dual就会返回java.sql.Date实例了。

2. 让current_timestamp返回标准java.sql.Timestamp

Oracle的CURRENT_TIMESTAMP返回的是TIMESTAMP WITH TIME ZONE类型,驱动默认返回oracle.sql.TIMESTAMPTZ。要转成标准的java.sql.Timestamp,可以添加连接属性:

oracle.jdbc.convertTimestampTZToTimestamp=true

同样可以追加到JDBC URL,或者放到Properties配置中。这个属性会把带时区的时间转换为数据库时区对应的java.sql.Timestamp。

如果需要保留时区信息,JDBC 4.2及以上版本可以用java.time.OffsetDateTime(Java 8+官方推荐的标准时间API,虽不属于java.sql.*但也是规范替代方案),通过指定类型获取:

OffsetDateTime odt = resultSet.getObject(1, OffsetDateTime.class);

二、在SQL层面显式转换

如果不想全局修改连接配置,也可以在查询语句中通过CAST函数转换类型:

  • 对于current_date:
    SELECT CAST(current_date AS DATE) FROM dual
    
    配合上面的mapDateToTimestamp=false属性,就能得到java.sql.Date。
  • 对于current_timestamp:
    SELECT CAST(current_timestamp AS TIMESTAMP) FROM dual
    
    这样查询结果会是数据库的TIMESTAMP类型,驱动会返回java.sql.Timestamp。

内容的提问来源于stack exchange,提问作者eastwater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:44:11