在“COPY .. TO ..”期间将时间戳转换为给定时区的本地时间

问题描述 投票:0回答:1

我在 PostgreSQL 数据库中有一个日志表,其中有一个类型为

event
的列。

现在我有一个 bash 脚本,它从日志数据库创建一个 CSV 文件:

timestamp without time zone

这是在托管数据库的云服务器上执行的,因此 log.csv 中的时间戳字符串采用服务器时区的本地时间。

但是,我喜欢用时间戳字符串来表示我自己时区的时间。所以我应该能够让 psql 将时间戳 -> 字符串转换为给定的时区。我怎样才能实现这个目标?

postgresql types timezone timestamp
1个回答
3
投票

... psql .. -c "COPY (SELECT event, ... FROM logtable order by event desc) TO STDOUT WITH CSV" logdb > log.csv ...

 而不是 
timestamptz。可以完全避免这个问题。
参见:

    忽略 Postgres 时间戳的时区
可以

使用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 的特定偏移量,与完整时区名称相反 这也可能意味着一组夏令时过渡日期规则。


相关:

    在选择计划项目时考虑 Postgres 中的 DST
  • 具有相同属性的时区名称在应用于时间戳时会产生不同的结果
  • 或者,更好的是,在任何地方使用
PST

,它会自动正常工作。

    

© www.soinside.com 2019 - 2024. All rights reserved.