簡體   English   中英

Java - Oracle - DB Insert - Timestamp to Date 列

[英]Java - Oracle - DB Insert - Timestamp to Date column

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

我試過了

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

但是沒有用。

提前致謝。

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 Oracle JDBC FAQ中列出了使用 10.2 JDBC 驅動程序存儲時間戳的可能解決方案,並在此處復制:

在 9.2 到 10.2 驅動程序中,有幾種方法可以解決此問題:

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

  • 更改您的應用程序以使用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

您還可以使用 JDBC 11.1 驅動程序(它們將針對 10g 實例工作),並且常見問題解答中有以下說明:

Oracle JDBC 11.1 修復了這個問題。 從此版本開始駕駛默認SQL DATE列映射到的java.sql.Timestamp。 無需設置 V8Compatible 即可獲得正確的映射。 V8Compatible 已被強烈棄用。 你根本不應該使用它。 如果您確實將其設置為 true,則不會有任何傷害,但您應該停止使用它。

我建議使用TIMESTAMP類型,特別是當我們想要計算兩個 TIMESTAMP 數據類型之間的時間差時,它比 DATE 數據類型容易得多。 有關更多詳細信息,請查看此帖子

只需在 SQL 語句中使用 to_date(?,'YYYY-MM-DD HH24:MI:SS') 並將日期格式化為字符串:

SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); ... ps.setString(index, dateTimeFormat.format(date));

如果需要,無論 OJDBC 驅動程序版本如何,它都可以工作。

最后,發現在存儲的時候,我們什么也做不了。 選擇時我們必須使用TO_CHAR。

謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM