簡體   English   中英

在PostgreSQL中,我們可以直接比較兩個帶有不同時區的時間戳嗎?

[英]In PostgreSQL, can we directly compare two timestamp with different time zone?

SELECT * FROM table_a 
WHERE time_1 >= to_timestamp('11/01/2014 10:00 PDT', 'MM/DD/YYYY HH24:MI TZ')

time_1是UTC時區,它是帶有時區的時間戳。 那么,這會給我我想要的東西還是我需要在to_timestamp()函數中執行精確的UTC時間?

Postgresql有兩種不同的時間戳數據類型,並且在使用哪種時會令人困惑。 兩種類型是:

  • timestamp (也稱為timestamp without time zone )最有可能是table_a中的類型
  • timestamp with time zone這是to_timestamp()返回的數據類型

您必須確保將蘋果與蘋果或成對配對而不是將它們混合在一起,否則可能會得到不良結果。

如果您的table_a.time_1timestamp with time zonetimestamp with time zone那么您在問題中提供的代碼將可以正常工作。

如果table_a.time_1是一個timestamp則需要更改代碼:

SELECT * 
  FROM table_a 
 WHERE time_1 >= to_timestamp('11/01/2014 10:00 PDT', 'MM/DD/YYYY HH24:MI TZ') at time zone 'utc';

此部分的最后一部分( at time zone 'utc' )將去除指定的時間戳上的時區(PDT),並將時間戳轉換為UTC。


編輯:以幫助您在此答案中的評論...

為了了解如何轉換時區,您需要了解兩種時間戳形式之間的差異。 很清楚為什么您需要在下面理解這一點。 正如我上面指出的那樣,兩種形式的時間戳之間的差異令人困惑。 有一個很好的手冊頁,但現在繼續閱讀。

要了解的主要內容是, 兩個版本都沒有實際存儲時區(盡管有名稱)。 如果您添加了額外的單詞“ translation”,則命名會更有意義。 考慮“沒有時區轉換的 時間戳 “有時區轉換的時間戳”

timestamp with time zone 轉換的 timestamp with time zone根本不存儲時區。 它旨在存儲可能來自世界任何地方的時間戳,並且對其含義沒有寬松的追蹤。 因此,在輸入一個時,您必須提供它來自的時區,否則postgresql將假定它來自您當前會話的時區 PostgreSQL自動將其從給定的時區轉換為服務器的內部時區。 您不需要知道哪個時區,因為在給您賦值之前,postgresql始終會將其從此內部時區轉換回去。 當您檢索值時(例如: SELECT my_time FROM foo ),postgresql將時間戳轉換為當前會話的時區。 或者,您可以指定要轉換為的時區(例如: SELECT my_time AT TIME ZONE 'PDT' FROM foo )。

考慮到這一點,您將更容易理解, 沒有時區轉換timestamp從您指定的時間就不會更改。 即使您在美國表示11,在英國表示12,Postgresql也會將11:00:00視為在12:00:00之前發生。 很容易看出為什么這可能不是您想要的。

一個非常常見的編程錯誤是認為timestamp with time zonetimestamp with time zone在特定的時區。 不是。 無論您要求哪個時區。 而且,如果您未指定所需的時區,則postgresql將假定您希望在當前會話時區使用。

您已經說過,您的字段是timestamp with time zonetimestamp with time zone所有timestamp with time zone均為UTC 從技術上講這是不正確的。 您的會話時區很可能是UTC,因此postgresql會為您提供UTC中的所有內容。

因此,您具有timestamp with time zonetimestamp with time zone並且想知道這些時間在PDT中是什么? 簡便: SELECT my_time AT TIME ZONE 'PDT' FROM foo

重要的是要了解AT TIME ZONE '...'語法在timestamptimestamp with time zone之間切換。

  • timestamp AT TIME ZONE 'PDT'轉換為timestamp with time zonetimestamp with time zone並告訴postgresql轉換為PDT時區。
  • timestamp with time zone AT TIME ZONE 'PDT'timestamp timestamp with time zone AT TIME ZONE 'PDT'轉換為timestamp告訴postgresql將其解釋為來自“ PDT”。

這種對稱性意味着要反轉AT TIME ZONE 'foo' ZONE'foo AT TIME ZONE 'foo'您只需使用AT TIME ZONE 'foo' ZONE'foo AT TIME ZONE 'foo' 換句話說,在SELECT anything AT TIME ZONE 'PDT' AT TIME ZONE 'PDT'中將始終保留anything

暫無
暫無

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

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