PostgreSQL 中 timestamp 和 timestamptz

首先直接说结论, timestamp 不带时区信息,timestamptz 带有时区信息。
insert 数据的时候,timestamp 不会携带时区信息,timestamptz 会携带 当前会话 使用的时区信息

在查询的时候如果时区没有改变,则查询结果一样。
如果 会话使用的时区数据保存的时区1️⃣(也就是插入数据的时候使用的时区,不手动设置时区的话就是配置文件中的时区)不同的时候, timestamp 查询到的时间不变,timestamptz 查询到的时间,会根据时区差自动改变

从官方手册时间类型部分,能找到这样一句话

SQL要求只写timestamp等效于timestamp without time zone,并且PostgreSQL™鼓励这种行为。timestamptz被接受为timestamp with time zone的一种简写,这是一种PostgreSQL™的扩展。
摘录来自
PostgreSQL 13.1 手册
PostgreSQL 全球开发组
https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=0
此材料可能受版权保护。

以下是对上述的一些验证

为了验证时区问题,让结果更容易理解,首先修改了配置文件中的时区配置,配置文件可以通过命令 show config_file 找到

# 将时区修改为 UTC 时区,也就是0时区
log_timezone = 'Etc/UTC'
timezone = 'Etc/UTC'

新建一张测试表

create table test_time (
    id serial,
    t1 timestamp,
    t2 timestamptz
)

插入一条测试数据,并查看当前时区

image.png

这个时候插入的数据和查询的数据没有区别,只是 t2 字段后面多了 +00 表示时区

我们切换时区到上海,也就是 +8时区 ,再次查询,需要注意,这里通过会话设置的时区仅对当前会话有效


image.png

这个时候我们可以看到 t1 时间没有改变,而t2 时间,随着时区增加了8个小时。

第二次验证

我们在 +8 时区的基础上,再次插入一条数据


image.png

然后我们重启开启一个新的回话,这样回话的时区就变回了数据库默认的UTC时区


image.png

这个时候,我们会看到,原来的第一条数据,查出来的结果又变成一样的了。
而第二条数据的 t2 字段,时间已经减小了8个小时

1️⃣ 数据保存的时区 这个词语的表述可能有问题,这里仅仅是为了方便理解。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容