【问题标题】:Why doesn't the timezone changes in these SQL expressions?为什么这些 SQL 表达式中的时区没有变化?
【发布时间】:2019-04-02 17:36:59
【问题描述】:

我正在尝试更新我的一张表的某个字段中的时区。我已经尝试了一些 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"

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

我如何才能真正更改 timestamp with time zone 字段的时区?

【问题讨论】:

  • 不要使用PST8PDT。使用基于地区的标识符,例如美国太平洋时间的America/Los_Angeles。对于您的时区,请使用America/Fotraleza

标签: postgresql timezone timestamp-with-timezone


【解决方案1】:

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

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

例子:

SET timezone = 'PST8PDT';

然后重试您的测试。

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

相关:

【讨论】:

    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2018-12-17
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多