Postgresql 为什么datetime没有时区,因为它有时区?
我正在试验时区 我的postgres表创建为:Postgresql 为什么datetime没有时区,因为它有时区?,postgresql,timezone,timezone-offset,Postgresql,Timezone,Timezone Offset,我正在试验时区 我的postgres表创建为: Table "public.xx" Column | Type | Collation | Nullable | Default --------+-----------------------------+-----------+----------+--------- dtz | timestamp with time zone |
Table "public.xx"
Column | Type | Collation | Nullable | Default
--------+-----------------------------+-----------+----------+---------
dtz | timestamp with time zone | | |
dt | timestamp without time zone | | |
服务器时区为“UTC”。我从《显示时区》中知道这一点
然后我插入数据:
insert into xx values( TIMESTAMP WITH TIME ZONE '2018-08-01 13:00:00+3', TIMESTAMP WITH TIME ZONE '2018-08-01 13:00:00+3' );
INSERT 0 1
tucha=> select * from xx;
dtz | dt
------------------------+---------------------
2018-08-01 10:00:00+00 | 2018-08-01 10:00:00
(1 row)
结果很容易理解:日期存储在UTC
中,因此减去3。还要注意
dtz
有+00
现在当我在时区使用时
tucha=> select dtz at time zone 'UTC', dt at time zone 'UTC' from xx;
timezone | timezone
---------------------+------------------------
2018-08-01 10:00:00 | 2018-08-01 10:00:00+00
(1 row)
对于没有时区的字段,添加了+00
,反之亦然:对于dtz
字段,添加了no+00
为什么会发生这种情况?一个简短的答案是-因为它是这样设计的: 时区中不带时区的时间戳返回时间戳 时区 时区为时区的时间戳返回 无时区时间戳 更长: 正如您所说,您的客户机在UTC时区工作,服务器总是在UTC中存储
timestamptz
,因此选择时间匹配(您在任何地方都使用UTC)
首先选择timestamtz
显示为+00
,因为这是一个时区感知字段,它会显示时区dt
不知道时区,因此不显示任何
现在,当您在时区使用
时
会要求显示某个特定时区的时间戳,因此时区感知数据类型会显示特定时区的时间(添加小时等),但在“移动”时间后,它不能重新用作时区感知(因为它不再是服务器UTC时间),因此它会隐藏TZ
。与不知道时区的时间相反,当在某个特定时区显示时,将获得该“意识”并扣除其显示的小时数+00
,这样您就知道您操作了TZ
不知道时间戳。我认为这就是这里的逻辑。一个简短的答案是——因为它是这样设计的:
时区中不带时区的时间戳返回时间戳
时区
时区为时区的时间戳返回
无时区时间戳
更长:
正如您所说,您的客户机在UTC时区工作,服务器总是在UTC中存储timestamptz
,因此选择时间匹配(您在任何地方都使用UTC)
首先选择timestamtz
显示为+00
,因为这是一个时区感知字段,它会显示时区dt
不知道时区,因此不显示任何
现在,当您在时区使用时
会要求显示某个特定时区的时间戳,因此时区感知数据类型会显示特定时区的时间(添加小时等),但在“移动”时间后,它不能重新用作时区感知(因为它不再是服务器UTC时间),因此它会隐藏TZ
。与不知道时区的时间相反,当在某个特定时区显示时,将获得该“意识”并扣除其显示的小时数+00
,这样您就知道您操作了TZ
不知道时间戳。我认为这就是这里的逻辑。我发现了如何使用时区():
因此–时区的时间戳给出了timestamp Tz,它表示给定区域的本地时间为给定时间的时刻
时区的timestamptz给出了timestamp,它显示了给定时间点在给定时区中的时间
我发现了如何使用时区():
因此–时区的时间戳给出了timestamp Tz,它表示给定区域的本地时间为给定时间的时刻
时区的timestamptz给出了timestamp,它显示了给定时间点在给定时区中的时间