那天我遇到了一個類似的問題,那就是時間分量從某些日期被截斷。
我們縮小了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