首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL date_part返回本地时区,而不是参数中的时区。

SQL date_part返回本地时区,而不是参数中的时区。
EN

Stack Overflow用户
提问于 2018-09-21 07:53:09
回答 2查看 237关注 0票数 0
代码语言:javascript
复制
SELECT date_part('timezone_hour', '2019-12-01 13:37:12 PST'::timestamptz) AS "tz"

代码语言:javascript
复制
SELECT date_part('timezone_hour', '2019-12-01 13:37:12 EST'::timestamptz) AS "tz"

这两个函数都返回-8,即我的本地太平洋时间GTM偏移量(以小时为单位),而不是函数参数中的时区。

extract也会发生同样的行为:

代码语言:javascript
复制
SELECT extract('timezone_hour' from '2019-12-01 13:37:12 PST'::timestamptz) AS "year"

代码语言:javascript
复制
SELECT extract('timezone_hour' from '2019-12-01 13:37:12 PST'::timestamptz) AS "year"

两者都返回-8

为什么我不能获得我为时间戳指定的时区偏移量?

EN

回答 2

Stack Overflow用户

发布于 2018-09-21 08:11:19

试试这些:

代码语言:javascript
复制
SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'PST') AS "tz";
SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'EST') AS "tz";
SELECT date_part('hour', '2019-12-01 13:37:12'::timestamp AT TIME ZONE 'AEST') AS "tz";

rextester (postgres)中,它们分别返回22、19和4

在您现有的方法中,如果您拉出"timezone_hour“,它将是您输入的值(因为这是该时区中的小时)。

票数 1
EN

Stack Overflow用户

发布于 2018-09-24 19:25:44

如果看一下PostgreSQL是如何显示这两个时间戳的,您会更好地理解:

代码语言:javascript
复制
SELECT TIMESTAMP WITH TIME ZONE '2019-12-01 13:37:12 PST';

      timestamptz       
------------------------
 2019-12-01 22:37:12+01
(1 row)

SELECT TIMESTAMP WITH TIME ZONE '2019-12-01 13:37:12 EST';

      timestamptz       
------------------------
 2019-12-01 19:37:12+01
(1 row)

在这两种情况下,时间戳都转换为timezone配置参数指定的会话时区。

PostgreSQL不在timestamp with time zone中存储时区信息,它将时间戳转换为协调世界时并以这种方式存储。显示时,时间戳将转换为当前会话时区。

因此,在PostgreSQL中,最好将timestamp with time zone称为“绝对时间戳”。它准确地表示某个时间点,但不包含时区信息。

换句话说,如果提取timezone_hour,将始终得到相同的结果:当前会话时区的时区偏移。

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

https://stackoverflow.com/questions/52434783

复制
相关文章

相似问题

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