我们的 DB 时区是 UTC。有时,我的用户忘记将其会话时区更改为 UTC,然后他们会出现不需要的行为(例如,在使用时now()
)。
有没有办法
- 强制所有会话使用 UTC 时区?
- 至少在连接时强制它们一次?
- 查询所有会话,他们使用什么时区设置?
pg_stat_activity
似乎不包含该信息。
示例为什么timestamp
不能解决我所有的问题:
create table a (c timestamp);
reset timezone;
show timezone; -- UTC
insert into a select now();
select * from a; -- 2024-03-13 12:50:14.515
set timezone to 'UTC+9';
show timezone; -- UTC+9
truncate a;
insert into a select now();
select * from a; -- 2024-03-13 03:50:48.376
reset timezone;
show timezone; -- UTC
select * from a; -- 2024-03-13 03:51:22.854
不,你不能做这两件事。会话时区是 PostgreSQL 后端进程中的全局变量,其他数据库会话无法访问。
您可以在 中设置该
TimeZone
参数postgresql.conf
,该参数将成为所有会话的默认值。但是您无法阻止交互式用户覆盖TimeZone
命令SET
或set_config()
函数。我认为强制
TimeZone
达到某个值没有什么意义。相反,每个数据库会话都应将参数设置为适合客户端的参数。如果您希望每个客户端的时间戳看起来都相同(您希望与时区无关),请使用timestamp without time zone
而不是timestamp with time zone
,您的问题就解决了。在您的情况下要避免的建议
timestamp with time zone
延伸到了函数。now()
返回 atimestamp with time zone
,因此您应该改用localtimestamp
它,它将事务时间戳返回为timestamp without time zone
。