PostgreSQL 提供兩種存儲時間戳的數據類型: 不帶時區的 TIMESTAMP 和帶時區的 TIMESTAMPTZ。 TIMESTAMP 數據類型可以同時存儲日期和時間,但它不存儲時區。這意味著,當修改了資料庫伺服器所在的時區時,它裡面存儲的值不會改變。 TIMESTAMPTZ 數據類型在存儲 ...
PostgreSQL 提供兩種存儲時間戳的數據類型: 不帶時區的 TIMESTAMP
和帶時區的 TIMESTAMPTZ
。
TIMESTAMP
數據類型可以同時存儲日期和時間,但它不存儲時區。這意味著,當修改了資料庫伺服器所在的時區時,它裡面存儲的值不會改變。
TIMESTAMPTZ
數據類型在存儲日期和時間的同時還能正確處理時區。PostgreSQL 使用 UTC 值來存儲 TIMESTAMPTZ
數據。在向 TIMESTAMPTZ
欄位插入值的時候,PostgreSQL 會自動將值轉換成 UTC 值,並保存到表裡。當從一個 TIMESTAMPTZ
欄位查詢數據的時候,PostgreSQL 會把存儲在其中的 UTC 值轉換成資料庫伺服器、用戶或當前連接所在的時區。
TIMESTAMP
和 TIMESTAMPTZ
都使用8位元組存儲空間。如下所示:
SELECT typname, typlen FROM pg_type WHERE typname ~ '^timestamp'; typname | typlen -------------+-------- timestamp | 8 timestamptz | 8 (2 rows)
重要提示,TIMESTAMPTZ
並不會存儲時區,它只是了 UTC 值,然後會和當前時區進行轉換。
時間戳示例
首先,創建一個含有 TIMESTAMP
和 TIMESTAMPTZ
的表:
CREATE TABLE timestamp_demo (ts TIMESTAMP, tstz TIMESTAMPTZ);
接下來,將資料庫伺服器的時區設置為 America/Los_Angeles
:
SET timezone = 'America/Los_Angeles';
順便說一句,可以使用 SHOW TIMEZONE
語句來顯示當前時區:
SHOW TIMEZONE;
然後,插入一些示例數據:
INSERT INTO timestamp_demo (ts, tstz) VALUES ( '2016-06-22 19:10:25-07', '2016-06-22 19:10:25-07' );
最後,查詢:
SELECT ts FROM timestampz_demo; ts | tstz ---------------------+------------------------ 2016-06-22 19:10:25 | 2016-06-22 19:10:25-07 (1 row)
再把時區設置為 America/New_York
:
SET timezone = 'America/New_York';
再查詢一次,結果如下:
ts | tstz ---------------------+------------------------ 2016-06-22 19:10:25 | 2016-06-22 22:10:25-04 (1 row)
TIMESTAMP
類型欄位的值不變,而 TIMESTAMPTZ
類型欄位的值變成了當前時區下的時間。
原文:https://pg.sjk66.com/postgresql/timestamp