我遇到了下面的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-08SELECT 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)中的本地时间。
发布于 2017-11-05 20:29:34
理解这一点的一种方法是将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中把我的头脑集中在时区上,我知道文档用另一种方式解释了这一点,但这种方式似乎更清楚。如有任何澄清,将不胜感激。
https://stackoverflow.com/questions/47126313
复制相似问题