关于postgresql:为什么这些SQL表达式中的时区没有变化?

Why doesn't the timezone changes in these SQL expressions?

我正在尝试更新其中一个表的某个字段中的时区。 我已经尝试过在一些SO帖子中看到过的几种方式,但似乎没有什么能改变实际的时区价值。

有人可以解释为什么......

1
2
3
4
5
SELECT
    now(),
    EXTRACT(timezone FROM now()) * INTERVAL '1sec',
    (now()::TIMESTAMP || 'PST8PDT')::timestamptz,
    EXTRACT(timezone FROM (now()::TIMESTAMP || 'PST8PDT')::timestamptz) * INTERVAL '1sec'

所有这些字段都有相同的时区? 福塔雷萨/巴西的结果是:

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

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

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


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

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

例:

1
SET timezone = 'PST8PDT';

然后重试您的测试。

AT TIME ZONE构造也可能是有用的。

有关:

  • 数据类型"带时区的时间戳"中的时区存储
  • 在PostgreSQL中设置timestamp列的时区
  • 在Rails和PostgreSQL中完全忽略时区