我遇到了以下使用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)。
答案 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
定义时间戳的输入时区,而第二个定义输出中显示的时间戳。