簡體   English   中英

時區感知 date_trunc 函數

[英]timezone aware date_trunc function

以下查詢

SELECT the_date FROM date_trunc('day', timestamp with time zone 
       '2001-01-1 00:00:00+0100') as the_date

結果

the_date
2000-12-31 00:00

有沒有辦法告訴 date_trunc 根據它提供的時區進行日/月/年轉換?

預期輸出為: 2001-01-1 00:00+0100

您需要指定要在哪個時區顯示

select
    date_trunc(
        'day',
        timestamp with time zone '2001-01-1 00:00:00+0100' at time zone '-02'
    ) as the_date;
      the_date       
---------------------
 2001-01-01 00:00:00

AT TIME ZONE

雖然標記的答案對於 OP 的奇怪情況可能是正確的,但對其他人來說更有可能是不正確的。 您需要將 date_trunc 返回的時間戳轉換為正確的時區。

select
    date_trunc(
        'day',
        some_timestamp at time zone users_timezone
    ) at time zone users_timezone as the_date;

要理解的重要一點是date_trunc返回一個沒有附加時區的timestamp 您需要將時間戳轉換為正確的時區,因為數據庫客戶端或任何下游可能有不同的時區。

@Adam 的回答肯定更有幫助。 雖然我認為我們可以再次改進它,因為如果我們將時間戳截斷為一天(或周/月/等),那么我們要確保我們處理的是日期對象,而不是時間戳。 否則,我們可能會給其他代碼片段的印象是某些事情實際上恰好發生在午夜(或可能是一天中的其他一些誤導時間)。

所以我會使用:

SELECT date_trunc('day', some_timestamp AT TIME ZONE users_timezone)::date AS the_date;

它將結果轉換為日期,而不是時間戳。

結果將類似於:

  the_date
------------
 2019-09-14

而不是更具誤導性的結果:

      the_date
---------------------
 2019-09-14 00:00:00

暫無
暫無

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

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