PostgreSQL如何查询客户端(而非服务端)的会话时区?
PostgreSQL会话时区查询方法
首先纠正一个常见认知偏差:你提到的SHOW TIME ZONE返回的不是固定的服务端全局时区,恰恰就是你需要的当前客户端会话的时区,默认格式就是IANA标准时区名称(比如Europe/Zurich、Australia/Sydney这类),可以直接传入timezone()等函数使用。
PostgreSQL的时区分为两个层级:
- 全局服务端默认时区:是数据库启动时从配置文件
postgresql.conf读取的默认值,仅作为新会话的初始时区使用 - 会话级时区:每个客户端连接后可以独立修改,所有会话内的时间函数、时区转换默认都使用这个值,
SHOW TIME ZONE默认返回的就是这个层级的时区。
几种获取会话时区的方式:
- 直接执行命令查询,适合手动调试时使用:
SHOW TIME ZONE;
- 用系统设置函数查询,适合嵌入到SQL语句中直接调用(你的转换场景可以直接用这个写法,不需要外部传入时区值):
-- 直接在timezone函数里调用即可 SELECT timezone(current_setting('TIMEZONE'), time_from_server) FROM your_table;
- PostgreSQL 12及以上版本还可以用专用函数获取:
SELECT pg_client_timezone();
如果你确实需要查询服务端的全局默认时区(而非当前会话时区),可以执行以下语句:
SELECT setting FROM pg_settings WHERE name = 'timezone' AND context = 'postmaster';
内容的提问来源于stack exchange,提问作者omatai
相关产品推荐
相关产品推荐

