我在 PostgreSQL 数据库中有一个日志表,其中有一个类型为
event
的列。现在我有一个 bash 脚本,它从日志数据库创建一个 CSV 文件:
timestamp without time zone
这是在托管数据库的云服务器上执行的,因此 log.csv 中的时间戳字符串采用服务器时区的本地时间。
但是,我喜欢用时间戳字符串来表示我自己时区的时间。所以我应该能够让 psql 将时间戳 -> 字符串转换为给定的时区。我怎样才能实现这个目标?
...
psql .. -c "COPY (SELECT event, ... FROM logtable order by event desc) TO STDOUT WITH CSV" logdb > log.csv
...
而不是
timestamptz
。可以完全避免这个问题。参见:
使用timestamp
构造,如
@NuLo建议,它可能甚至可以工作,但不完全按照描述。
AT TIME ZONE
将类型
AT TIME ZONE
(timestamp
) 转换为 timestamp without time zone
(timestamptz
),反之亦然。 timestamp with time zone
值的文本表示取决于您运行命令的会话中时区的当前设置。这两个
timestamptz
值100 % 相同(表示同一时间点):
timestamptz
但是文本表示是不是
。显示针对不同时区。如果您将此字符串文字输入到 '2015-09-02 15:55:00+02'::timestamptz
'2015-09-02 14:55:00+01'::timestamptz
类型,则时区部分将被
忽略,最终会得到 不同 值。因此,如果您在与原始
timestamp
值相同时区设置的会话中运行 COPY
语句,则建议的操作 happens会起作用。 然而,最干净的方法是通过应用
timestamp
两次来生成正确的
timestamp
值:
AT TIME ZONE
SELECT event AT TIME ZONE 'my_target_tz' AT TIME ZONE 'my_source_tz', ...
FROM logtable
ORDER BY event desc;
是“您自己的时区”,
'my_target_tz'
是示例中云服务器的时区。为了确保遵守夏令时,请使用时区名称,而不是时区缩写。 文档: 时区缩写,例如
'my_source_tz'
。这样的规格仅仅 定义相对于 UTC 的特定偏移量,与完整时区名称相反 这也可能意味着一组夏令时过渡日期规则。
相关:
PST
,它会自动正常工作。