2016-03-06 78 views
1

我有一個表格用於存儲帶時區的iso日期。我意識到日期應該「始終」存儲爲utc,但我對該規則有例外。時間戳與它們運行的​​服務器沒有任何關係。我想能夠存儲這樣的ISO日期: 2016-03-06T01:15:52-06:00 無論服務器的時區或其他任何我想要的時間戳返回爲: 2016- 03-06T01:15:52-06:00Postgres預防帶時區轉換的時間戳

目前如果我插入iso日期,它會自動將其轉換爲任何服務器時區。我上面的日期被轉換爲: 2016-03-06 07:15:52 + 00(服務器是utc)

我唯一能想到的是將時區偏移量存儲在單獨的列中,將我的日期存儲爲utc然後使用偏移列轉換,非常混亂。當然,有一種方法可以將我的日期存儲在一列中,並將其排除在最初創建的方式之外?

+0

_確實有一種方法可以將我的日期存儲在一列中,並將其排除在最初創建的方式上:yes,「text」類型。 –

+0

聽起來就好像你正在使用帶時區的時間戳一樣。如果你不希望它轉換使用'timestamp'而不是 –

+0

@DanielVérité是的,但這會阻止我使用任何日期函數。 – TrippRitter

回答

1

您提出的解決方案是正確的。或者更準確地說,它是幾個正確的實現之一。以下任何一項都可以工作:

  • 將UTC時間戳存儲在一個字段中,將偏移量存儲在另一個字段中。
  • 本地時間戳存儲在一個字段中,將偏移量存儲在另一個字段中。
  • 將本地date存儲在一個字段中,並將time with time zone存儲在另一個字段中。 (儘管time with time zone一般不鼓勵......)
  • 將UTC時間戳存儲在一個字段中,並將本地時間戳存儲在另一個字段中。

最簡單的是第一個,你已經提出了。

我會避免在text字段中存儲時間戳,因爲它們往往不是非常有效的搜索。

另請注意 - 如果您來自SQL Server後臺,您可能會想起它的datetimeoffset類型,它在字段中存儲本地日期時間和偏移量,並在索引期間使用UTC等效項。通常認爲Postgres和MySQL的timestamp with time zone會有相同的行爲,但它們不會。他們只是使用會話時區來轉換爲UTC。 SQL Server沒有會話時區的概念,因此存在差異。

請務必閱讀this part of the Postgres docs

+0

那就是我害怕的。謝謝 :) – TrippRitter