[英]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<> 在这里摆弄
您可能还需要调整列默认值。 看:
我有一个没有时区的可为空时间戳类型的列。 它以这种格式存储在我的 Postgres 数据库中:
2021-06-24 11:00:00
。
timestamp
或timestamptz
值永远不会以任何格式存储。 格式化属于display领域,并且在很大程度上独立于存储类型。 存储的是一个 8 字节的整数,其分辨率为微秒,表示一个时间点。 您显示的显示是使用 ISO 8601 的标准 Postgres 文本表示(对于输入也是明确的)。 使用二进制协议的客户端可能会选择不同的表示。 即使是使用文本协议的客户端也可能选择以不同方式重新格式化。
我想将其转换为
timestamp with time zone type
的可为空timestamp with time zone type
,以便将其显示为2021-06-24 11:00:00.000-00
。
显示的时间偏移不是由数据类型决定的。 如果当前时TimeZone
设置(通常是 UTC)是这样,您只会看到附加时区-00
。 否则,您会得到不同的偏移量,时间戳也会相应地移动。
用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
都没有“有”时区,它只是针对给定的时区显示。 这两种类型都不存储任何时区信息。 看:
要将时间戳转换回 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
构造在timestamp
和timestamptz
之间进行转换。 结果类型总是从输入切换。
这里的基础知识:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.