Timezone

在 Redshift 中使用特定格式將 UTC 時間轉換為本地時間

  • February 9, 2017

我有一個名為created_at儲存在 UTC 中沒有時區的數據的列,例如:2017-02-05 15:43:27.151

我想以特定格式轉換為其他時區,如 CET:

2017-02-08 16:43:27 +01:00

我成功將時間轉換為特定時區,但需要指定輸入的時區。查詢看起來像:

SELECT created_at, 
      (created_at AT TIME ZONE 'UTC') AT TIME ZONE 'CET' AS cet 
FROM my_table;

[
 {
   "created_at" : "2017-02-08 15:43:27.151",
   "cet"        : "2017-02-08 16:43:27.151"
 }
]

但我未能從時區程式碼中提取或生成時區偏移量。

我試過了

SELECT EXTRACT(TIMEZONE_HOUR
              FROM
                (SELECT '2017-02-08 15:43:27.151' AT TIME ZONE 'CET'));
[
 {
   "date_part" : 0
 }
]

如何獲得2017-02-08 16:43:27 +01:00

編輯 1

SHOW timezone; --utc
SELECT current_timestamp; -- 2017-02-09 11:00:20.225039+00
SELECT to_char(current_timestamp AT TIME ZONE 'CET', 'YYYY-MM-DD HH24:MI:SS OF'); -- 2017-02-09 12:00:35 +00

為什麼偏移量是 00?(我使用OF是因為我在 Redshift 上)?

的 | 與 UTC 的偏移量;僅對 TIMESTAMPTZ 有效

來自文件

編輯2:我想把AT TIME ZONE 'CET'日期改成timestamptz,但我錯了。您需要轉換日期,::timestamptz然後OF將顯示 UTC 偏移量。

SELECT to_char((current_timestamp AT TIME ZONE 'CET')::timestamptz, 'YYYY-MM-DD HH24:MI:SS OF'); 
--2017-02-09 14:48:48 +01

現在我需要添加:00.

搜尋 Redshift 文件後:

我終於做到了:

SELECT to_char((current_timestamp AT TIME ZONE 'CET')::timestamptz, 'YYYY-MM-DD HH24:MI:SS OF') || ':00' AS created_at
-- 2017-02-09 15:10:15 +01:00

時間戳需要轉換為預期的時區AT TIME ZONE ...,然後使用時區進行轉換,否則OF將不會顯示 UTC 偏移量。

:00在驗證時區無法顯示帶有分鐘的時區後添加:

SELECT pg_timezone_names();
SELECT '2017-02-08 15:43:27.151' AT TIME ZONE 'CET' - '2017-02-08 15:43:27.151' AT TIME ZONE 'UTC'

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