我有两个数据库运行在不同时区的不同服务器上。有几个表包含
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 或类似的方法进行此类转换?
timstamptz
(timestamp with time zone
) 在内部将值存储为 UTC 时间戳(自 2000 年以来计算微秒的整数值),这与这些值显示所针对的时区无关。它确实“不”像某些人想象的那样存储任何时区信息,从而错误地判断了名称。您可以根据需要转储和恢复。
您在客户端中看到的内容取决于会话的时区设置。 运行(在同一会话中以避免工件):
SHOW timezone;
如果您看到
localtime
,则 Postgres 使用服务器操作系统的默认设置。
设置不同的时区(在您的会话中使用SET timezone = ...;
,为您的用户或在配置文件中全局设置)以查看不同格式的时间戳。请注意,在这种情况下,转储文件中的时区设置
不会有任何影响,只有当前会话的设置有影响。 参见: