【问题标题】:Postgres 9.6, timezones: why are those two queries giving me different timesPostgres 9.6,时区:为什么这两个查询给了我不同的时间
【发布时间】:2020-01-26 17:37:11
【问题描述】:

好的,所以我一直对时区感到困惑。我正在好转,但还没有。各位大神能指教一下吗?

上下文:我从前端收到 UTC 时间。例如,要表示日期 1 September 2019,我会得到 2019-08-31 22:00:00Z(我们在布鲁塞尔 DST,因此有 2 小时的差异)。

从那个日期开始,我需要在此之前生成一系列 6 个月。这就是March April May June July August

我设法找到了解决方案,说实话有点不走运。我仍然不确定我是否了解以下发生的细节:

database=> show timezone;
 TimeZone 
----------
 UTC
(1 row)

database=> select generate_series(
        ('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '6 month'::interval,
        ('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '1 month'::interval,
        '1 month'::interval
      );
   generate_series   
---------------------
 2019-02-28 00:00:00
 2019-03-28 00:00:00
 2019-04-28 00:00:00
 2019-05-28 00:00:00
 2019-06-28 00:00:00
 2019-07-28 00:00:00
(6 rows)

database=> select generate_series(
        ('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '6 month'::interval,
        ('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '1 month'::interval,
        '1 month'::interval
      );
   generate_series   
---------------------
 2019-03-01 00:00:00
 2019-04-01 00:00:00
 2019-05-01 00:00:00
 2019-06-01 00:00:00
 2019-07-01 00:00:00
 2019-08-01 00:00:00

如果我使用::timestamp,为什么会得到错误的结果?

【问题讨论】:

    标签: postgresql timezone utc


    【解决方案1】:

    实际上有两个不同的“运算符”,名为AT TIME ZONE,一个将timestamp with time zone 转换为timestamp without time zone,另一个则相反。

    如果第一个参数是 timestamp with time zone,则该值将转换为 timestamp without time zone,以显示该时区的挂钟。

    如果第一个参数是timestamp without time zone,它会在会话时区中解释(由timezone 参数的值给出)并转换为绝对时间戳。

    现在timestamp with time zone 是日期/时间类型类别首选类型,因此第二个查询中的字符串文字被解释为timestamp with time zonethe documentation。在第一个查询中,它是timestamp without time zone。由于涉及到不同的算子,结果不同也就不足为奇了。

    在您的第一个查询中,挂钟时间 22:00 被解释为时钟挂在布鲁塞尔,因此它实际上是 20:00 UTC。 generate_series 的第一个参数是计数开始的,然后是 2019 年 2 月 28 日 20:00 UTC(在转换为 date 之前)。

    【讨论】:

      猜你喜欢
      • 2021-11-27
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2015-08-11
      相关资源
      最近更新 更多