【问题标题】:Different uses of at time zone statement in Postgres?Postgres中at time zone语句的不同用途?
【发布时间】:2018-04-17 23:43:24
【问题描述】:

我遇到了以下 SQL 语句,它对 at time zone 有这种奇怪的用法。

select timestamp '2000-01-01 12:00:00' at time zone 'utc+5' at time zone 'utc+5';

文档没有太大帮助,但通过以下示例,at time zone 似乎可以以两种不同的方式使用:

示例(假设当地时区为 PST8PDT):

SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';

结果: 2001-02-16 19:38:40-08

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';

结果:2001-02-16 18:38:40

第一个例子需要一些时间 没有时区的标记并将其解释为 MST 时间 (UTC-7),即 然后转换为 PST (UTC-8) 进行显示。第二个例子取 以 EST (UTC-5) 指定的时间戳并将其转换为本地时间 MST (UTC-7)。

【问题讨论】:

    标签: postgresql date timezone timestamp


    【解决方案1】:

    理解这一点的一种方法是将at time zone 视为具有两种不同的用途,一种用于修改输入的 时间戳,另一种用于修改显示的输出

    (在以下所有示例中,我将使用 UTC 作为本地时区。您可以使用 SET TIMEZONE TO 'UTC' 进行设置)

    修改输入

    您可以使用at time zone 告诉 Postgres 您输入的时间应该用另一个时区来解释。

    select timestamp '2000-01-01 12:00:00' at time zone 'utc+5';
    

    显示时间相差 5 小时:

            timezone        
    ------------------------
     2000-01-01 17:00:00+00
    

    这相当于在输入的时间戳本身中给出时区(查看时间戳末尾的'-5'):

    select timestamp with time zone '2000-01-01 12:00:00-5';
    

    以这种方式使用at time zone,您可以告诉 Postgres 您在当前配置的时区之外的另一个时区输入数据,Postgres 将相应地转换输出以匹配您的本地时区(在我们的例子中,UTC)。

    修改输出

    在上面的示例中,输出的时区假定为您的本地时区,但您可以使用at time zone 修改它,但前提是您的时间戳已经包含时区信息。例如:

    select timestamp with time zone '2000-01-01 12:00:00-5' at time zone 'utc+5';
    

    它不会将输出显示为我们的本地时区,而是保留原始时区:

          timezone       
    ---------------------
     2000-01-01 12:00:00
    

    相当于:

    select timestamp '2000-01-01 12:00:00' at time zone 'utc+5' at time zone 'utc+5';
    

    第一个at time zone 定义时间戳的输入时区,而第二个定义输出中显示的时间戳。

    PS:我写所有这些都是为了让我的头脑了解 Postgres 中的时区,我知道文档在概念上以另一种方式解释了这一点,但这种方式似乎更清楚。任何澄清表示赞赏。

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 2015-03-12
      • 2015-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多