6

我有两个数据库在不同时区的不同服务器上运行。有几个表包含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 或类似的方法进行这种转换?

4

1 回答 1

7

Postgres 的数据类型timstamptz( = ) 在内部将值存储为 UTC 时间戳(自 2000 年以来的整数值计数微秒),这与显示timestamp with time zone这些值的时区无关。它不会某些人可能认为的那样存储任何时区信息,从而误判了名称。您可以随心所欲地转储和恢复。

您在客户端中看到的内容取决于会话的时区设置

运行(在同一会话中以避免伪影):

SHOW timezone;

如果您看到localtime,则 Postgres 使用您的服务器操作系统的默认设置。

设置不同的时区(在您的会话中SET timezone = ...;,为您的用户或在配置文件中全局设置)以查看格式不同的时间戳。请注意,转储文件中的时区设置在这种情况下没有任何影响,只有当前会话的设置有影响。

此相关答案中的详细说明:

关于设置环境变量的各种方式:

于 2013-11-29T17:12:01.703 回答