Postgresql Postgres 9.6,时区:为什么这两个查询给了我不同的时间
好吧,所以我对时区一直很模糊。我正在好转,但还没有好转。你们这些人能启发我吗 上下文:我从前端接收UTC时间。例如,为了表示日期Postgresql Postgres 9.6,时区:为什么这两个查询给了我不同的时间,postgresql,timezone,utc,Postgresql,Timezone,Utc,好吧,所以我对时区一直很模糊。我正在好转,但还没有好转。你们这些人能启发我吗 上下文:我从前端接收UTC时间。例如,为了表示日期2019年9月1日,我将得到2019-08-31 22:00:00Z(我们在布鲁塞尔夏令时,因此相差2小时) 从那一天开始,我需要在那之前生成一个6个月的系列。这就是三月四月五月六月七月八月 我设法找到了解决办法,说实话,这有点运气。我仍然不确定我是否了解下面发生的事情的细节: database=> show timezone; TimeZone ------
2019年9月1日
,我将得到2019-08-31 22:00:00Z
(我们在布鲁塞尔夏令时,因此相差2小时)
从那一天开始,我需要在那之前生成一个6个月的系列。这就是三月四月五月六月七月八月
我设法找到了解决办法,说实话,这有点运气。我仍然不确定我是否了解下面发生的事情的细节:
database=> show timezone;
TimeZone
----------
UTC
(1 row)
database=> select generate_series(
('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '6 month'::interval,
('2019-08-31 22:00:00Z'::timestamp at time zone 'Europe/Brussels')::date - '1 month'::interval,
'1 month'::interval
);
generate_series
---------------------
2019-02-28 00:00:00
2019-03-28 00:00:00
2019-04-28 00:00:00
2019-05-28 00:00:00
2019-06-28 00:00:00
2019-07-28 00:00:00
(6 rows)
database=> select generate_series(
('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '6 month'::interval,
('2019-08-31 22:00:00Z' at time zone 'Europe/Brussels')::date - '1 month'::interval,
'1 month'::interval
);
generate_series
---------------------
2019-03-01 00:00:00
2019-04-01 00:00:00
2019-05-01 00:00:00
2019-06-01 00:00:00
2019-07-01 00:00:00
2019-08-01 00:00:00
如果我使用
::timestamp
?实际上有两种不同的&ldauo;操作符“在时区命名为”,一个将带时区的时间戳转换为不带时区的时间戳,另一个转换为带时区的时间戳
如果第一个参数是带时区的时间戳
,则该值将转换为不带时区的时间戳
,该值显示该时区的挂钟的功能
如果第一个参数是不带时区的时间戳
,它将在会话时区中解释(由时区
参数的值给出),并转换为绝对时间戳
现在,带时区的时间戳
是日期/时间类型类别的首选类型,因此,第二个查询中的字符串文字将根据定义解释为带时区的时间戳。在第一个查询中,它是一个不带时区的时间戳。由于涉及不同的运营商,因此结果不同也就不足为奇了
在您的第一个查询中,墙上的时钟时间22:00被解释为时钟挂在布鲁塞尔,因此实际上是UTC 20:00。generate_series
的第一个参数是2019年2月28日20:00 UTC(在转换到日期之前),从该参数开始计数