我设置了一个安装在中央时区服务器上的 postgres 数据库,因此所有时间戳列都在中央时区。
postgres 中有没有办法将数据库中的所有时区列从 CST 更改为 GMT?将数据库配置为使用 GMT 是最佳实践吗?
我设置了一个安装在中央时区服务器上的 postgres 数据库,因此所有时间戳列都在中央时区。
postgres 中有没有办法将数据库中的所有时区列从 CST 更改为 GMT?将数据库配置为使用 GMT 是最佳实践吗?
好吧,最佳做法是避免使用TIMESTAMP对时区一无所知的类型,并始终使用TIMESTAMPTZ(缩写TIMESTAMP WITH TIME ZONE)类型来存储您的时间戳。
TIMESTAMPTZ存储时间戳UTC和最初写入时间戳的时区(如CST,PST或GMT+6)。这使您可以始终正确地操作和显示这些列,无论当前服务器或客户端时区设置是什么。
您应该能够使用以下方式将现有的 TIMESTAMP 列转换为 TIMESTAMPTZ:
ALTER TABLE mytable ALTER COLUMN old_tstamp TYPE TIMESTAMPTZ
在执行此操作之前,您应该在小型数据集或小型测试表上进行试验,以了解从 TIMESTAMP 到 TIMESTAMPTZ 的转换如何真正为您工作,以便将时区信息保留在您的数据中。
如果转换无法正常工作,您可以使用如下语句临时设置当前会话的时区(仅用于转换目的ALTER TABLE ... COLUMN ... TYPE):
SET timezone TO 'CST6CDT';
或者
SET timezone TO 'UTC+6';
这将影响后续的操作和从TIMESTAMPto 的转换TIMESTAMPTZ——只要确保它正确。
将所有时间戳转换为 后TIMESTAMPTZ,服务器或客户端时区设置(默认为当前操作系统时区设置)仅用于显示目的,因为数据操作将始终正确。