我有两个数据库在不同时区的不同服务器上运行。有几个表包含timestamp with timezone
。
我需要从一个数据库转储数据,然后使用正确的时间戳和正确的时区将其导入另一个数据库。
我使用以下命令转储数据:
pg_dump -a DB_NAME > dump.sql
我看到数据采用旧时间戳和时区格式: 2013-11-29 14:30:00+02
然后我使用命令到另一台服务器来恢复转储:
psql -d DB_NAME -f dump.sql
我看到时间戳和时区来自旧服务器 - 我认为这是正常的。
然后我尝试将以下命令放在dump.sql的开头
SET timezone ...
但仍然无效。 :(
这是一次性操作。一旦传输数据不需要同步。有没有办法使用pg_dump和pg_restore或类似的方法进行这种转换?
答案 0 :(得分:6)
Postgres数据类型timstamptz
(= timestamp with time zone
)在内部存储值为UTC时间戳(自2000年以来计算微秒的整数值),这与显示的值的时区无关 for。 不 存储任何时区信息,例如某些人可能会想到的,错误判断名称。您可以根据需要进行转储和恢复。
您在客户端中 看到 的内容取决于会话的time zone setting。
运行(在同一会话中避免伪像):
SHOW timezone;
如果您看到localtime
,则Postgres会使用您服务器操作系统的默认设置。
为您的用户设置一个不同的时区(在SET timezone = ...;
的会话中,或在配置文件中设置全局),以查看不同格式的时间戳。请注意转储文件中的时区设置不在这种情况下有效,只有当前会话的设置有效。
相关答案中的详细解释:
关于设置环境变量的各种方法: