Postgres的时区声明的不同用途?

时间:2017-11-05 20:29:34

标签: postgresql date timezone timestamp

我遇到了以下使用at time zone的奇怪用法的SQL语句。

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)。

1 个答案:

答案 0 :(得分: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中围绕时区,我知道文档以另一种方式在概念上解释了这一点,但这种方式似乎更清晰。任何澄清都表示赞赏。