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 dualmapDateToTimestamp=false属性,就能得到java.sql.Date。 - 对于
current_timestamp:
这样查询结果会是数据库的SELECT CAST(current_timestamp AS TIMESTAMP) FROM dualTIMESTAMP类型,驱动会返回java.sql.Timestamp。
内容的提问来源于stack exchange,提问作者eastwater
相关产品推荐
相关产品推荐

