我设置了一个安装在中央时区服务器上的 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';
这将影响后续的操作和从TIMESTAMP
to 的转换TIMESTAMPTZ
——只要确保它正确。
将所有时间戳转换为 后TIMESTAMPTZ
,服务器或客户端时区设置(默认为当前操作系统时区设置)仅用于显示目的,因为数据操作将始终正确。