我设置了一个安装在中央时区服务器上的postgres数据库,因此所有时间戳列都在中央时区。
在postgres中是否有办法将数据库中的所有时区列从CST更改为GMT?配置数据库以使用GMT是最佳做法吗?
答案 0 :(得分:1)
嗯,最佳做法是避免使用对时区不了解的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
到TIMESTAMPTZ
的后续操作和转化 - 只需确保正确。
将所有时间戳转换为TIMESTAMPTZ
后,服务器或客户端时区设置(默认为当前操作系统时区设置)仅对显示有用,因为数据操作始终是正确的。