为什么这些SQL表达式中的时区没有更改?

时间:2018-10-29 18:08:19

标签: postgresql timezone timestamp-with-timezone

我正在尝试更新我的一张桌子的某个字段中的时区。我在某些SO帖子中以几种方式进行了尝试,但似乎没有任何更改可以更改实际时区值。

任何人都可以解释为什么...

select 
    now(), 
    extract(timezone from now()) * interval '1sec', 
    (now()::timestamp || 'PST8PDT')::timestamptz, 
    extract(timezone from (now()::timestamp || 'PST8PDT')::timestamptz) * interval '1sec'

所有这些字段都具有相同的时区?在福塔雷萨/巴西对我来说,结果是:

2018-10-29 14:52:04.55495-03 | -03:00:00 | 2018-10-29 18:52:04.55495-03 | -03:00:00"

为什么?最后两个值不应该具有PST时区吗?

如何实际更改timestamp with time zone字段的时区?

1 个答案:

答案 0 :(得分:1)

您无法更改时区,因为数据类型timestamp with time zone实际上并未存储开始的时区。时区仅用作输入/输出修改器。在内部,存储各个UTC时间戳值。

当前会话的timezone设置确定该值的显示。要更改显示,请更改timezone设置。 (即,假装在不同的时区中,当前时间以不同的方式显示。)

示例:

SET timezone = 'PST8PDT';

然后重试您的测试。

AT TIME ZONE构造也可能有帮助。

相关: