那天我遇到了一个类似的问题,那就是时间分量从某些日期被截断。
我们缩小了Oracle驱动程序版本的差异。
Oracle的常见问题有关于这个部分:
select sysdate from dual; ...while(rs.next())
此前9201,这将返回: 的getObject为SYSDATE:java.sql.Timestamp中< < < < GETDATE为SYSDATE :java.sql.Date getTimetamp for sysdate:java.sql.Timestamp
从9201开始,以下内容将被ret urned
的getObject为SYSDATE:java.sql.Date < < < < < GETDATE为SYSDATE:java.sql.Date >>没有变化 getTimetamp为SYSDATE:java.sql.Timestamp中>>没有变化
注意:java.sql.Date没有时间部分,而java.sql.Timestamp没有。
通过对数据类型映射进行此更改,JDBC驱动程序从8i/9iR1升级到920x JBDC驱动程序时,某些应用程序将失败并且/或生成不正确的结果。 为了保持兼容性并在升级后保持应用程序正常工作,提供了兼容性标志。开发人员现在有一些选择:
- 使用oracle.jdbc.V8Compatible标志。
默认情况下,JDBC驱动程序未检测到数据库版本。若要更改兼容性标志用于处理TIMESTAMP数据类型,连接属性
“oracle.jdbc.V8Compatible”
可以被设置为“真”并且驾驶员的行为,因为它在8i中表现,901X,9 200(与尊重TIMESTAMPs)。
默认情况下该标志设置为'false'。在OracleConnection构造函数中,驱动程序获取服务器版本并适当地设置兼容性标志。
java.util.Properties prop=newjava.util.Properties();
prop.put("oracle.jdbc.V8Compatible","true");
prop.put("user","scott");
prop.put("password","tiger");
String url="jdbc:oracle:thin:@host:port:sid";
Connection conn = DriverManager.getConnection(url,prop);
随着JDBC 10.1.0.x,代替连接属性,下面的系统属性,可以使用:JAVA -Doracle.jdbc.V8Compatible =真.....注:该标志是一个客户端只有管理时间戳和日期映射的标志。它不会影响任何数据库功能。 '
'2。相应地处理Date和TimeStamp列数据类型时,请使用set/getDate和set/getTimestamp。
9i服务器支持Date和Timestamp列类型DATE映射到java.sql.Date并且TIMESTAMP映射到java.sql.Timestamp。
所以对于我的情况,我有这样的代码:
import java.util.Date;
Date d = rs.getDate(1);
随着9i中我得到一个java.sql.Timestamp中(这是java.util.Date的子类),所以一切时髦,我有我的时间和分钟。
但是使用10g,相同的代码现在得到一个java.sql.Date(也是java.util.Date的一个子类,所以它仍然可以编译),但是HH:MM是TRUNCATED !!。
第二个解决方案对我来说很简单 - 只需用getTimestamp替换getDate,你就可以了。我想这是一个坏习惯。
关键字** **转换,这就是为什么我得到的2小时 – n002213f 2009-10-02 13:06:20
我很困惑,如果转换工作正常,不应该看他那为2小时不到的日期,而不是更多? – wds 2009-10-02 13:55:19
@wds - 检查我的编辑和回复 – n002213f 2009-10-02 15:04:56