簡體   English   中英

我應該將時區與Postgres和JDBC的時間戳分開存儲嗎?

[英]Should I store the timezone separately from the timestamp for Postgres and JDBC?

似乎(也許我錯了)如果你想保留JDBC和Postgres發生某些事情的時區,你需要將時區與時間戳分開存儲。

那就是我更願意給我的ORM / JDBC / JPA一個Java Calendar (或Joda DataTime ),比如說timezone America/New_York到Postgres timestampz字段。 並且我希望無論服務器時區(或默認為UTC)檢索都能給我帶回時區America/New_YorkCalendar 但只是查看大多數JDBC代碼(以及依賴於它的事情不會發生)。

這個對嗎?

當postgres支持時,我需要將tz存儲在另一個字段中,這似乎很荒謬。

因此,似乎只有兩個選項:

  1. 選擇timestampz Postgres列作為java.util.String並解析它。
  2. 將時區存儲為單獨的字段。

第一和第二選項需要某種轉換攔截器用於我的SQL映射/ ORM庫。

  • 什么是JDBC的最佳解決方案?
  • JPA的最佳解決方案是什么(如果與JDBC不同)?

當您存儲timestamp with time zonetimestamptz )的timestamptz它將轉換為UTC以存儲在數據庫中。 檢索時,它會轉換為客戶端的當前時區,而不是原來的時區。基本上,這是一個時間點。

還有timestamp without time zone timestamptimestamp )。 這是不受轉換,但攜帶時間戳它。 如果您將客戶端時區設置為UTC存儲timestamp ,然后在客戶端時區為“+08:00”時檢索它,則會得到相同的值。 這是你想要的一半,因為它保留了原始時間值。

名稱和行為很糟糕且令人困惑,但是由SQL標准設置。

如果要在特定時區記錄時間點,則必須單獨存儲時區。 我建議將它存儲為帶有CHECK約束的INTERVAL ,將其限制為名稱colname BETWEEN INTERVAL '-12' HOUR + INTERVAL '1' SECOND AND INTERVAL '12' HOUR 該定義拒絕-12:00並接受+12:00; 我不完全確定這是對的,所以檢查一下。

您可以在該時區存儲本地時間的timestamp (我可能會這樣做),或者存儲事件發生時UTC時間的timestamptz以及允許您將其轉換為本地時間的偏移量。

兩者都適用於JDBC。 對於JPA,它取決於您的提供者理解的程度並映射區間類型。 理想情況下,您希望實體中的瞬態生成字段使用存儲在數據庫中的timestampinterval重建所需的Calendar實例。

EclipseLink支持在Oracle中存儲時區,我認為如果你定制了PostgreSQLPlatform,你也可以將它存儲在Postgres中。

暫無
暫無

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

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