gpt4 book ai didi

PostgreSQL 时区

转载 作者:行者123 更新时间:2023-11-29 13:17:07 27 4
gpt4 key购买 nike

我正在尝试了解 session 时区在 PostgreSQL 中的工作原理。

当我将 session 时区设置为“01:00”时,返回日期为“-01:00”。符号总是颠倒的,我不理解这种行为。

这怎么解释?

postgres=# set time zone '00:00';
SET
postgres=# select timestamp with time zone '2017-11-29 15:00:00.000000+00';
timestamptz
------------------------
2017-11-29 15:00:00+00
(1 row)

postgres=# set time zone '01:00';
SET
postgres=# select timestamp with time zone '2017-11-29 15:00:00.000000+00';
timestamptz
------------------------
2017-11-29 14:00:00-01
(1 row)

postgres=# set time zone '-01:00';
SET
postgres=# select timestamp with time zone '2017-11-29 15:00:00.000000+00';
timestamptz
------------------------
2017-11-29 16:00:00+01
(1 row)

最佳答案

例子,在这里

  • ts 是时间(文本)——就是我们所说的时间,:
  • not_aware 如果我们不知道它的时区(说话人的本地时间)
  • 知道时间,但知道它的时区(如果服务器时区是 UTC,则为 utc 时区)

,所以:

s=# with s(city,tz) as (values('Moscow','UTC+3'),('New York','UTC-5'))
, ts as (select '2017-01-01 00:00:00'::text ts)
select *,ts::timestamp at time zone tz not_aware, ts::timestamptz at time zone tz aware
from s
join ts on true;
city | tz | ts | not_aware | aware
----------+-------+---------------------+------------------------+---------------------
Moscow | UTC+3 | 2017-01-01 00:00:00 | 2017-01-01 03:00:00+00 | 2016-12-31 21:00:00
New York | UTC-5 | 2017-01-01 00:00:00 | 2016-12-31 19:00:00+00 | 2017-01-01 05:00:00
(2 rows)

假设您来自伦敦,并拥有显示 UTC0 的 watch 时间 - 伦敦本地(这是您的服务器,时区为 UTC0)。现在飞往莫斯科,看着克里姆林宫的时钟,你会看到 ts,午夜。你的 watch 知道时差,它们会告诉你到新年是在三个小时后(这是 timestamptz - aware 列)。这就是为什么 UTC+3需要减去时间。因为对于您的服务器来说,莫斯科时间是 future ,因此当您看到本地 2017 年时,对于服务器来说,它仍然是 2016 年,并且会持续 +3 小时...

现在您预期的行为(not_aware 列)更加棘手。服务器运行在 UTC0 ,但必须假装它对“实时”一无所知。由于没有时区的时间戳就是这种类型。所以它的行为就好像你在电视上观看红场的新年庆祝事件,只需滚动条以将你的 watch 调整为克里姆林宫时钟,所以实际上你看到的时间是你的伦敦时间 +3(not_aware ) 列。

关于PostgreSQL 时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47555028/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com