2011-08-26 103 views
4

我有一個數據類型爲DATE的表列。我通過Java PreparedStatement插入,如何在插入時存儲時間戳?是否可以在DATE列中存儲時間戳記?Java - Oracle - 數據庫插入 - 時間戳日期列

我試圖

ps.setTimestamp(index, new java.sql.Timestamp(date.getTime())); 

但沒有奏效。

在此先感謝。

回答

8

在的Oracle SQL類型和JDBC類型之間的映射是有點複雜,特別是對於DATETIMESTAMP SQL類型。

Oracle數據庫允許您在DATE列中存儲時間戳記信息,這與SQL標準中DATE的定義完全相反。在9.2引入TIMESTAMP列支持之前,Statement.setTimestamp可用於DATE列。從9.2開始直到11.1,JDBC驅動程序將SQL DATE類型映射到JDBC Date和SQL TIMESTAMP類型到JDBC Timestamp。使用10.2 JDBC驅動程序存儲時間戳可能的解決方案是在Oracle JDBC FAQ上市了,在這裏轉載:

有幾種方法,通過10.2 驅動程序,以解決在9.2這個問題:

  • 改變你的表使用TIMESTAMP而不是DATE。這很可能是 ,但它是最好的解決方案。

  • 改變您的應用程序以使用defineColumnType將列 定義爲TIMESTAMP而不是DATE。有這個問題,因爲 你真的不想使用defineColumnType,除非你必須(請參閱 什麼是defineColumnType,我應該什麼時候使用它?)。

  • 改變你的應用程序使用getTimestamp而不是getObject。如果可能,這個 是一個很好的解決方案,然而許多應用程序包含依賴於getObject的通用代碼 ,所以它不總是可能的。

  • 設置V8Compatible連接屬性。這告訴JDBC驅動程序 使用舊映射而不是新映射。您可以將此標誌 設置爲連接屬性或系統屬性。您通過將其添加到傳遞給DriverManager.getConnection的java.util.Properties對象 或 OracleDataSource.setConnectionProperties來設置連接屬性 。通過在java命令行中包含-D選項來設置系統屬性 。

    的Java -Doracle.jdbc.V8Compatible = 「真」 MyApp的

您也可以使用JDBC驅動程序11.1(他們將工作對一個10g實例),和常見問題解答中有這樣一段狀態:

Oracle JDBC 11.1修復了這個問題。從此版本開始, 驅動程序默認將SQL DATE列映射到java.sql.Timestamp。有 是不需要設置V8Compatible來獲得正確的映射。 強烈建議不要使用V8Compatible。你根本不應該使用它。如果 確實將它設置爲true,它不會損害任何內容,但是您應該停止使用它,即 。

1

我建議TIMESTAMP類型,特別是當我們想計算兩個TIMESTAMP數據類型之間的時間差比DATE數據類型容易得多。欲瞭解更多詳情,請看看這個post

0

最後發現,當存儲時,我們無能爲力。選擇時,我們必須使用TO_CHAR。

由於

+0

這是不正確的。有幾件事可以做。 –