Postgresql 为什么datetime没有时区,因为它有时区?

Postgresql 为什么datetime没有时区,因为它有时区?,postgresql,timezone,timezone-offset,Postgresql,Timezone,Timezone Offset,我正在试验时区 我的postgres表创建为: Table "public.xx" Column | Type | Collation | Nullable | Default --------+-----------------------------+-----------+----------+--------- dtz | timestamp with time zone |

我正在试验时区

我的postgres表创建为:

                       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,它显示了给定时间点在给定时区中的时间