簡體   English   中英

將不帶時區的時間戳轉換為帶時區的時間戳

[英]Convert timestamp without timezone into timestamp with timezone

我有一個類型為 nullable timestamp without time zone 它以這種格式存儲在我的 Postgres 數據庫中: 2021-06-24 11:00:00 我想將其轉換為timestamp with time zone類型的可為空timestamp with time zone ,以便將其顯示為2021-06-24 11:00:00.000-00 請注意,沒有時區轉換。

該解決方案還應允許將timestamp with time zone轉換為timestamp without time zone 我做了一些研究,但找不到任何東西。

您正在尋找AT TIME ZONE ,這有點令人困惑,但可以做您需要的一切。

要將已知為 UTC 的時間戳轉換為時間戳:

SELECT '2021-06-24 11:00:00'::timestamp AT TIME ZONE 'UTC';
=> 2021-06-24 06:00:00-05

所有 timestamptz 值都以 UTC 格式存儲在 Postgres 內部,並且不保留它們插入的時區,因此它們將顯示在您的連接時區中。 您可以再次使用AT TIME ZONE將時間戳轉換回所需區域中的時間戳(正如 Erwin 在下面指出的, AT TIME ZONE始終在時間戳和時間戳之間切換):

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC';
=> 2021-06-24 11:00:00

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'America/Chicago';
=> 2021-06-24 06:00:00

假設表tbl的時間戳列ts和時間戳表示 UTC 時間,解決方案是:

ALTER TABLE tbl ALTER COLUMN ts type timestamptz USING ts AT TIME ZONE 'UTC';

db<> 在這里擺弄

您可能還需要調整列默認值。 看:

誤會1(問題)

我有一個沒有時區的可為空時間戳類型的列。 它以這種格式存儲在我的 Postgres 數據庫中: 2021-06-24 11:00:00

timestamptimestamptz值永遠不會以任何格式存儲。 格式化屬於display領域,並且在很大程度上獨立於存儲類型。 存儲的是一個 8 字節的整數,其分辨率為微秒,表示一個時間點。 您顯示的顯示是使用 ISO 8601 的標准 Postgres 文本表示(對於輸入也是明確的)。 使用二進制協議的客戶端可能會選擇不同的表示。 即使是使用文本協議的客戶端也可能選擇以不同方式重新格式化。

誤會2(問題)

我想將其轉換為timestamp with time zone type的可為空timestamp with time zone type ,以便將其顯示為2021-06-24 11:00:00.000-00

顯示的時間偏移不是由數據類型決定的。 如果當前時TimeZone設置(通常是 UTC)是這樣,您只會看到附加時區-00 否則,您會得到不同的偏移量,時間戳也會相應地移動。

誤會3(答案)

用UTC表示(這里的輸出值看起來沒有時區,但類型是timestamptz):

 SELECT '2021-06-24 11:00:00'::timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'UTC'; => 2021-06-24 11:00:00

不,輸出值的類型是timestamp 默認文本表示中的timestamptz永遠不會“看起來”像timestamp timestamp從不“具有”時區。 甚至timestamptz都沒有“有”時區,它只是針對給定的時區顯示。 這兩種類型都不存儲任何時區信息。 看:

誤會4(答案)

要將時間戳轉換回 UTC 時間的時間戳:

 SELECT ('2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC')::timestamp; => 2021-06-24 11:00:00

不只是:

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC';

結果是類型timestamp 沒有額外的演員。
AT TIME ZONE構造timestamptimestamptz之間進行轉換。 結果類型總是從輸入切換。

這里的基礎知識:

暫無
暫無

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

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