首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >at时区语句在Postgres中的不同用途?

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

Stack Overflow用户
提问于 2017-11-05 20:29:34
回答 1查看 37关注 0票数 0

我遇到了下面的SQL语句,它使用了at time zone这种奇怪的用法。

代码语言:javascript
复制
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)中的本地时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-05 20:29:34

理解这一点的一种方法是将at time zone看作有两种不同的用途,一种是修改输入的时间戳,另一种是修改显示的输出

(在下面的所有示例中,我将使用UTC作为本地时区。你可以用SET TIMEZONE TO 'UTC'来设置它)

修改输入

您可以使用at time zone告诉Postgres您要输入的时间应该用另一个时区来解释。

代码语言:javascript
复制
select timestamp '2000-01-01 12:00:00' at time zone 'utc+5';

它使显示时间相差5小时:

代码语言:javascript
复制
        timezone        
------------------------
 2000-01-01 17:00:00+00

这相当于在输入时间戳本身中给出时区(查看时间戳末尾的'-5‘):

代码语言:javascript
复制
select timestamp with time zone '2000-01-01 12:00:00-5';

通过这种方式使用at time zone,您可以告诉Postgres您正在另一个时区输入数据,而不是当前配置的数据,Postgres将相应地转换输出以匹配您的本地时区(在我们的例子中是UTC)。

修改输出

在上面的例子中,输出的时区被假定为您的本地时区,但是您可以使用at time zone修改这个时区,但前提是您的时间戳已经包含时区信息。例如:

代码语言:javascript
复制
select timestamp with time zone '2000-01-01 12:00:00-5' at time zone 'utc+5';

它不将输出显示为本地时区,而是保留原始时区:

代码语言:javascript
复制
      timezone       
---------------------
 2000-01-01 12:00:00

相当于:

代码语言:javascript
复制
select timestamp '2000-01-01 12:00:00' at time zone 'utc+5' at time zone 'utc+5';

第一个at time zone定义时间戳的输入时区,第二个定义输出中显示的时间戳。

PS:我写这一切是为了在Postgres中把我的头脑集中在时区上,我知道文档用另一种方式解释了这一点,但这种方式似乎更清楚。如有任何澄清,将不胜感激。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47126313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档