Postgres中at时区语句的不同用途



我遇到了下面的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)。

理解这一点的一种方法是将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定义时间戳的输入时区,而第二个定义输出中显示的时间戳。

附言:我写这一切是为了在Postgres中了解时区,我知道文档从另一个角度解释了这一点,但这种方式似乎更清晰。如有任何澄清,不胜感激。

相关内容

  • 没有找到相关文章

最新更新