當客戶端執行時區邏輯時,timestamptz 是首選嗎?
我正在將 Web 應用程序從 SqlServer 遷移到 PostgreSQL,並且正在嘗試找出要替換
datetime2
的類型。一般建議似乎總是使用
timestamptz
,從不使用timestamp
。給出的原因往往與時間戳和timestamptz
儲存相同(因此沒有性能損失)並timestamptz
自動轉換為連接的時區。在 Rails 和 PostgreSQL 中完全忽略時區 | 堆棧溢出不幸的是,我的舊 .NET 程式碼庫與日期時間非常不一致,我們通常以 UTC 呈現,而不管使用者時區如何。最近的程式碼一直在使用 NodaTime 和它的
Instant
類,但我們很少需要處理時間,並且只顯示日期已經“足夠接近”了。但是,我對正確使用 NodaTime 的理解是盡可能晚地將其轉換為 - 而不是在數據庫中Instant
。LocalDateTime
除此之外,我不完全確定 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
),這可能會有所不同,但可能不會對您的特定問題產生影響,即使問題標題幾乎聽起來像您可能會要求那。有關的: