繁体   English   中英

将不带时区的时间戳转换为带时区的时间戳

[英]Convert timestamp without timezone into timestamp with timezone

我有一个类型为 nullable timestamp without time zone 它以这种格式存储在我的 Postgres 数据库中: 2021-06-24 11:00:00 我想将其转换为timestamp with time zone类型的可为空timestamp with time zone ,以便将其显示为2021-06-24 11:00:00.000-00 请注意,没有时区转换。

该解决方案还应允许将timestamp with time zone转换为timestamp without time zone 我做了一些研究,但找不到任何东西。

您正在寻找AT TIME ZONE ,这有点令人困惑,但可以做您需要的一切。

要将已知为 UTC 的时间戳转换为时间戳:

SELECT '2021-06-24 11:00:00'::timestamp AT TIME ZONE 'UTC';
=> 2021-06-24 06:00:00-05

所有 timestamptz 值都以 UTC 格式存储在 Postgres 内部,并且不保留它们插入的时区,因此它们将显示在您的连接时区中。 您可以再次使用AT TIME ZONE将时间戳转换回所需区域中的时间戳(正如 Erwin 在下面指出的, AT TIME ZONE始终在时间戳和时间戳之间切换):

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC';
=> 2021-06-24 11:00:00

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'America/Chicago';
=> 2021-06-24 06:00:00

假设表tbl的时间戳列ts和时间戳表示 UTC 时间,解决方案是:

ALTER TABLE tbl ALTER COLUMN ts type timestamptz USING ts AT TIME ZONE 'UTC';

db<> 在这里摆弄

您可能还需要调整列默认值。 看:

误会1(问题)

我有一个没有时区的可为空时间戳类型的列。 它以这种格式存储在我的 Postgres 数据库中: 2021-06-24 11:00:00

timestamptimestamptz值永远不会以任何格式存储。 格式化属于display领域,并且在很大程度上独立于存储类型。 存储的是一个 8 字节的整数,其分辨率为微秒,表示一个时间点。 您显示的显示是使用 ISO 8601 的标准 Postgres 文本表示(对于输入也是明确的)。 使用二进制协议的客户端可能会选择不同的表示。 即使是使用文本协议的客户端也可能选择以不同方式重新格式化。

误会2(问题)

我想将其转换为timestamp with time zone type的可为空timestamp with time zone type ,以便将其显示为2021-06-24 11:00:00.000-00

显示的时间偏移不是由数据类型决定的。 如果当前时TimeZone设置(通常是 UTC)是这样,您只会看到附加时区-00 否则,您会得到不同的偏移量,时间戳也会相应地移动。

误会3(答案)

用UTC表示(这里的输出值看起来没有时区,但类型是timestamptz):

 SELECT '2021-06-24 11:00:00'::timestamp AT TIME ZONE 'UTC' AT TIME ZONE 'UTC'; => 2021-06-24 11:00:00

不,输出值的类型是timestamp 默认文本表示中的timestamptz永远不会“看起来”像timestamp timestamp从不“具有”时区。 甚至timestamptz都没有“有”时区,它只是针对给定的时区显示。 这两种类型都不存储任何时区信息。 看:

误会4(答案)

要将时间戳转换回 UTC 时间的时间戳:

 SELECT ('2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC')::timestamp; => 2021-06-24 11:00:00

不只是:

SELECT '2021-06-24 11:00:00-00'::timestamptz AT TIME ZONE 'UTC';

结果是类型timestamp 没有额外的演员。
AT TIME ZONE构造timestamptimestamptz之间进行转换。 结果类型总是从输入切换。

这里的基础知识:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM