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

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

我正在尝试更新我的一个表的某个字段中的时区。我尝试了一些 SO 帖子中的几种方法,但似乎没有任何改变实际时区值。

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

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

所有这些字段都具有相同的时区?我在 Fortaleza/Brazil 中的结果是:

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 字段的时区?

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

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

示例:

SET timezone = 'PST8PDT';

然后重试您的测试。

AT TIME ZONE 构造也可能有用。

相关:

  • Set timestamp column's timezone in PostgreSQL
  • Ignoring time zones altogether in Rails and PostgreSQL