Oracle9或11使用了Oracle10的驱动引起的时间丢失

Oracle中在DDL的时候,列类型date是包括时间+时间的,并且精确到毫秒. 不存在仅仅是日期(不包括时间)的列类型,而列类型timestamp可以认为是精度更高的date类型,能精确到纳秒(在windows操作系统只能精确到1000纳秒)。

Java中的Date类有二种,一种是带时间的java.util.Date,一种是不带时间仅有日期的java.sql.Date.还有一种是既带时间又带日期的java.sql.Timestamp.

一.java写oracle

1.java写入oracle的date列时:

java.util.Date,java.sql.Timestamp二种类型不仅会写入日期还会写入时间.

java.sql.Date,Oracle只会写入日志,时间部分会使用默认的00:00:00来存储.

2.java写入oracle的timestamp列时:

应该使用java.sql.Timestamp

二.oracle读到java

1.如果是date类型的列(比较麻烦,如果使用了现有的驱动ojdbc14, 在将date类型转换成java的date类时,会使用java.util.Date的继承类java.sql.Date,而不是java.util.Date,由于前者不会保留时间部分,只有日期.导致查询出来的时间部分丢失.)

java如果使用了错误的驱动,有三种解决办法:

1)解决的办法: (1).将date类型改为timestamp类型(不推荐使用). (2).在datasource的连接参数里设置oracle.jdbc.V8Compatible=true;(兼容老的驱动程序,由于老的驱动是正确转换的,这样会将date列正确转换成java.util.Date

2)将date列类型转成timestamp类型. Oracle的所有驱动都会将timestamp转换成java.sql.Timestamp. 肯定不会丢失时间部分



参考文章:

http://www.blogjava.net/midea0978/archive/2008/06/13/207655.html


原文地址:https://www.cnblogs.com/highriver/p/2020358.html