Postgresql

當客戶端執行時區邏輯時,timestamptz 是首選嗎?

  • May 1, 2018

我正在將 Web 應用程序從 SqlServer 遷移到 PostgreSQL,並且正在嘗試找出要替換datetime2的類型。

一般建議似乎總是使用timestamptz,從不使用timestamp。給出的原因往往與時間戳和timestamptz儲存相同(因此沒有性能損失)並timestamptz自動轉換為連接的時區。在 Rails 和 PostgreSQL 中完全忽略時區 | 堆棧溢出

不幸的是,我的舊 .NET 程式碼庫與日期時間非常不一致,我們通常以 UTC 呈現,而不管使用者時區如何。最近的程式碼一直在使用 NodaTime 和它的Instant類,但我們很少需要處理時間,並且只顯示日期已經“足夠接近”了。但是,我對正確使用 NodaTime 的理解是盡可能晚地將其轉換為 - 而不是在數據庫中InstantLocalDateTime

除此之外,我不完全確定 Postgres 如何知道“目前使用者”的正確時區。我知道您可以將時區專門設置為會話參數SET TIME ZONE 'UTC';,您是否希望針對“目前使用者”的每個連接都執行此操作?如果是這樣,每當從連接池中檢索連接時是否會重置?我還看到 Npgsql 能夠為連接字元串設置時區,如果它是每個使用者的,大概這不合適?

所有這一切讓我認為最好的選擇是使用timestamp所有日期時間,並使用應用程序邏輯轉換為本地日期時間。我想另一種選擇是timestamptz用於所有日期時間,強制連接在連接字元串中使用 UTC,並使用應用程序邏輯轉換為本地日期時間。但是我擔心 Postgres 在 UTC 和 UTC 之間進行無操作轉換時會執行額外的工作。

TLDR:timestamptz如果應用程序始終插入/讀取 UTC 並轉換為本地日期時間本身,是否仍是首選?

timestamptz如果應用程序始終插入/讀取 UTC 並轉換為本地日期時間本身,仍然是首選?

嗯,不。然後使用起來非常簡單/快速timestamp

但是“應用程序”是訪問數據庫的*唯一客戶端嗎?*它會在數據庫的整個生命週期內保持這種狀態嗎?

如果仍有疑問,我仍然會使用timestamptz,這是安全的選擇。您已經在 SO 上找到了我的相關答案,我建議您作為基本資訊的參考:

此外,timestamptz字面上是 Postgres 中“日期/時間類型”中的“首選”類型(標記typeispreferred在 中pg_type),這可能會有所不同,但可能不會對您的特定問題產生影響,即使問題標題幾乎聽起來像您可能會要求那。有關的:

引用自:https://dba.stackexchange.com/questions/203352