我遇到了下面的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中了解时区,我知道文档从另一个角度解释了这一点,但这种方式似乎更清晰。如有任何澄清,不胜感激。