首先直接說結(jié)論, timestamp 不帶時(shí)區(qū)信息,timestamptz 帶有時(shí)區(qū)信息。
在 insert 數(shù)據(jù)的時(shí)候,timestamp 不會(huì)攜帶時(shí)區(qū)信息,timestamptz 會(huì)攜帶 當(dāng)前會(huì)話 使用的時(shí)區(qū)信息
在查詢的時(shí)候如果時(shí)區(qū)沒有改變,則查詢結(jié)果一樣。
如果 會(huì)話使用的時(shí)區(qū) 和 數(shù)據(jù)保存的時(shí)區(qū)1??(也就是插入數(shù)據(jù)的時(shí)候使用的時(shí)區(qū),不手動(dòng)設(shè)置時(shí)區(qū)的話就是配置文件中的時(shí)區(qū))不同的時(shí)候, timestamp 查詢到的時(shí)間不變,timestamptz 查詢到的時(shí)間,會(huì)根據(jù)時(shí)區(qū)差自動(dòng)改變
從官方手冊(cè)時(shí)間類型部分,能找到這樣一句話
SQL要求只寫timestamp等效于timestamp without time zone,并且PostgreSQL?鼓勵(lì)這種行為。timestamptz被接受為timestamp with time zone的一種簡(jiǎn)寫,這是一種PostgreSQL?的擴(kuò)展。
摘錄來自
PostgreSQL 13.1 手冊(cè)
PostgreSQL 全球開發(fā)組
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=0
此材料可能受版權(quán)保護(hù)。
以下是對(duì)上述的一些驗(yàn)證
為了驗(yàn)證時(shí)區(qū)問題,讓結(jié)果更容易理解,首先修改了配置文件中的時(shí)區(qū)配置,配置文件可以通過命令 show config_file 找到
# 將時(shí)區(qū)修改為 UTC 時(shí)區(qū),也就是0時(shí)區(qū)
log_timezone = 'Etc/UTC'
timezone = 'Etc/UTC'
新建一張測(cè)試表
create table test_time (
id serial,
t1 timestamp,
t2 timestamptz
)
插入一條測(cè)試數(shù)據(jù),并查看當(dāng)前時(shí)區(qū)

這個(gè)時(shí)候插入的數(shù)據(jù)和查詢的數(shù)據(jù)沒有區(qū)別,只是
t2 字段后面多了 +00 表示時(shí)區(qū)
我們切換時(shí)區(qū)到上海,也就是 +8時(shí)區(qū) ,再次查詢,需要注意,這里通過會(huì)話設(shè)置的時(shí)區(qū)僅對(duì)當(dāng)前會(huì)話有效

這個(gè)時(shí)候我們可以看到 t1 時(shí)間沒有改變,而t2 時(shí)間,隨著時(shí)區(qū)增加了8個(gè)小時(shí)。
第二次驗(yàn)證
我們?cè)?+8 時(shí)區(qū)的基礎(chǔ)上,再次插入一條數(shù)據(jù)

然后我們重啟開啟一個(gè)新的回話,這樣回話的時(shí)區(qū)就變回了數(shù)據(jù)庫(kù)默認(rèn)的UTC時(shí)區(qū)

這個(gè)時(shí)候,我們會(huì)看到,原來的第一條數(shù)據(jù),查出來的結(jié)果又變成一樣的了。
而第二條數(shù)據(jù)的 t2 字段,時(shí)間已經(jīng)減小了8個(gè)小時(shí)
1?? 數(shù)據(jù)保存的時(shí)區(qū) 這個(gè)詞語的表述可能有問題,這里僅僅是為了方便理解。