簡體   English   中英

在 PostgreSql 中創建表時如何為時間戳列指定時區

[英]How to specify time zone for the time stamp column when creating table in PostgreSql

我正在創建一個帶有時間戳列的表,我正在糾結時區設置,我想在列上指定時區,如下所示:

create table t1(a date, b timestamp with time zone 'America/Los_Angeles', c timestamp without time zone)

但是語法不對,請問如何在列上指定時區,比

👉 定義列時沒有指定時區。

CREATE TABLE t1
(
    a DATE ,
    b TIMESTAMP WITH TIME ZONE ,
    c TIMESTAMP WITHOUT TIME ZONE
)
;

您需要仔細閱讀 文檔 憑直覺編程往往會以糟糕的方式結束。

Postgres 中的TIMESTAMP WITH TIME ZONE類型保存時區。 該類型使用隨輸入提供的任何偏移量或時區信息來調整到距 UTC 零小時-分鍾-秒的偏移量。 👉 該列中的每個值都設置為零偏移量。 在調整到零偏移量后,提供的時區或偏移量信息將被 Postgres 丟棄。

如果您關心原始時區,則需要自己將該值寫入單獨的列中。

相反, TIMESTAMP WITHOUT TIME ZONE類型缺少任何時區概念或與 UTC 的偏移量。 這種類型的列僅存儲日期和時間。 因此,此列中的值不能代表時刻,不能引用時間軸上的特定點。 如果您寫的是去年 1 月 23 日中午,我們無法知道您是指日本東京的中午、法國圖盧茲的中午,還是美國俄亥俄州托萊多的中午。 那將是三個不同的時刻,相隔幾個小時。

其他一些數據庫與 Postgres 具有相同的行為。 但不是所有的。 SQL 標准幾乎沒有涉及日期時間的主題,只是提到了類型,但沒有關於規定行為的太多細節。 因此,日期時間行為因數據庫引擎而

我應該提一下,一些工具有一個反特性,它們會注入一個默認時區,用於將存儲在 UTC 中的值調整到該時區。 不幸的是, pgAdmin就是這樣一種工具。 雖然出於對用戶的方便的善意,但這種行為會產生已存儲和檢索時區的錯覺。 我寧願所有工具都“說真話”,並報告檢索到的偏移量為零的值。 一種解決方法是將數據庫會話的當前默認時區設置為 UTC。

所有這些都已經在 Stack Overflow 以及姊妹網站https://dba.stackexchange.com/上多次介紹過。 搜索以了解更多信息。

暫無
暫無

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

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