完整信息(和它比這裏所描述和可能取決於其在Oracle驅動程序的特定版本都在使用更復雜的)是理查德·耶的answe [R在這裏 - [現已過期鏈接Nabble]
快速抓住它從nabble到期前...
羅傑, 見:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_01
具體做法是: 簡單數據類型 是什麼繼續與DATE和TIMESTAMP? 本節介紹簡單的數據類型。 :-)
在9.2之前,Oracle JDBC驅動程序將DATE SQL類型映射到java.sql.Timestamp。這有一定的意義,因爲Oracle DATE SQL類型包含日期和時間信息,就像java.sql.Timestamp一樣。對java.sql.Date的映射更明顯是有點問題,因爲java.sql.Date不包含時間信息。 RDBMS也不支持TIMESTAMP SQL類型,所以將DATE映射到Timestamp沒有問題。
9.2在TIMESTAMP支持被添加到RDBMS。 DATE和TIMESTAMP的區別在於TIMESTAMP包含納秒,DATE不包含。因此,從9.2開始,DATE被映射到Date並且TIMESTAMP被映射到Timestamp。不幸的是,如果您依賴DATE值來包含時間信息,則存在問題。
有解決這個問題的幾種方法:
改變你的表使用TIMESTAMP,而不是過時了。這很可能是不可能的,但它是最好的解決方案。
改變您的應用程序以使用defineColumnType將列定義爲TIMESTAMP而不是DATE。有這樣的問題,因爲你真的不想使用defineColumnType,除非你必須(請參閱什麼是defineColumnType,我應該什麼時候使用它?)。
改變你的應用程序使用getTimestamp而不是getObject。如果可能的話,這是一個很好的解決方案,但是很多應用程序都包含依賴於getObject的泛型代碼,因此並不總是可行的。
設置V8Compatible連接屬性。這告訴JDBC驅動程序使用舊映射而不是新映射。您可以將此標誌設置爲連接屬性或系統屬性。您可以通過將連接屬性添加到傳遞給DriverManager.getConnection或OracleDataSource.setConnectionProperties的java.util.Properties對象來設置連接屬性。您可以通過在java命令行中包含-D選項來設置系統屬性。
java -Doracle.jdbc.V8Compatible =「true」MyApp Oracle JDBC 11.1修復了此問題。從此版本開始,驅動程序默認將SQL DATE列映射到java.sql.Timestamp。沒有必要設置V8Compatible來獲得正確的映射。 V8Compatible強烈棄用。你根本不應該使用它。如果你將它設置爲true,它不會傷害任何東西,但你應該停止使用它。
儘管很少用到這種方式,但V8Compatible並不修復DATE到日期問題,而是支持與8i數據庫的兼容性。 8i(和更舊的)數據庫不支持TIMESTAMP類型。設置V8Compatible不僅導致SQL DATE在從數據庫讀取時映射到時間戳,還導致所有時間戳在寫入數據庫時轉換爲SQL DATE。由於8i不受支持,因此11.1 JDBC驅動程序不支持此兼容模式。出於這個原因,V8Compatible是desupported。
如上所述,默認情況下,11.1版驅動程序在從數據庫讀取時將SQL DATE轉換爲時間戳。這總是正確的做法,9i的改變是一個錯誤。 11.1車手已恢復到正確的行爲。即使您沒有在應用程序中設置V8Compatible,在大多數情況下也不應該看到任何行爲差異。如果您使用getObject讀取DATE列,您可能會注意到不同之處。結果將是一個時間戳而不是日期。由於Timestamp是Date的一個子類,所以這通常不是問題。如果您依賴從DATE到Date的轉換來截斷時間組件,或者如果您對該值執行toString,您可能會注意到不同之處。否則,更改應該是透明的。
如果由於某種原因,您的應用程序對此更改非常敏感,並且您只需具有9i-10g行爲,則可以設置連接屬性。將mapDateToTimestamp設置爲false,驅動程序將恢復爲默認的9i-10g行爲並將DATE映射到日期。
如果可能,您應該將您的列類型更改爲TIMESTAMP而不是DATE。
- 理查德
羅傑·沃斯寫道: 我張貼以下的計算器問題/問題,因此,如果有人知道的決議,將是很好的看到它回答有:
的Oracle SQL DATE通過Java JDBC使用iBATIS
這裏轉換問題的問題描述:
我目前WRES使用Java的iBATIS處理Oracle SQL DATE轉換問題。
正在使用Oracle JDBC瘦驅動程序ojdbc14版本10.2.0.4.0。 iBATIS版本2.3.2。 Java 1.6.0_10-rc2-b32。
的問題圍繞着正在被這個片段的SQL返回的日期類型的列:
SELECT * FROM 表(pk_invoice_qry.get_contract_rate(,,,,,,??????? ,?,?,?))order by from_date
程序包過程調用返回一個正在包裝在TABLE中的遊標遊標,在那裏很容易讀取結果集,就像對錶進行select查詢一樣。
在PL/SQL開發人員,其中一列返回,FROM_DATE,SQL日期型,具有精度一天的時間:
Tue Dec 16 23:59:00 PST 2008
但是當我通過iBATIS的和JDBC,值訪問此只當顯示像這樣
Tue Dec 16 12:00:00 AM PST 2008
這是清晰的:保持精確到天
應該是:紀元以來的01 1229500740000毫秒週二,2008年12月16日,下午11點59分零零秒PST
但是,讓這個代替: 1229414400000毫秒紀元以來 週二,2008年12月16日12:00:00 AM PST (如Java的類實例。 sql.Date)
無論我嘗試什麼,我都無法公開此DATE列的完整精度以通過Java JDBC和iBATIS返回。
什麼iBATIS的是從映射是這樣的:
FROM_DATE:2008-12-03:類java.sql中。日期
當前iBATIS的映射是這樣的:
我也試過:
或
但是,所有試圖映射產生相同的截斷日期值。就好像JDBC在iBATIS甚至觸及它之前已經做了丟失數據精度的損害。
顯然,當我留在PL/SQL Developer中運行相同的SQL代碼段作爲測試腳本時,我沒有通過JDBC和iBATIS取消部分數據精度。根本不可接受,非常令人沮喪,並最終非常可怕。
鏈接無法正常工作;( – 2013-06-27 09:10:52