首页 > 解决方案 > 如何更改时间列以在 TimescaleDB 中包含时区?

问题描述

如何在 TimescaleDB 中将列类型从时间戳更改为 timestamptz?

我使用摄取脚本outflux将数据从 InfluxDB 获取到 TimescaleDB。这创建了使用时间戳作为时间列的表。

CREATE TABLE conditions (
    time        TIMESTAMP       NOT NULL,
    location    TEXT              NOT NULL,
    temperature DOUBLE PRECISION  NULL
);

我尝试使用标准的 alter命令将其转换为 timestamptz

alter table conditions
alter column "time" type timestamptz using ("time"::timestamptz)

但这产生了以下错误

ERROR:  check constraint "constraint_1007" of relation "_hyper_12_1007_chunk" is violated by some row
CONTEXT:  SQL statement " ALTER TABLE _timescaledb_internal._hyper_12_1007_chunk ADD CONSTRAINT constraint_1007 CHECK ( "time" >= TIMESTAMPTZ '2020-12-03 01:00:00+01' AND "time" < TIMESTAMPTZ '2020-12-10 01:00:00+01' ) "
PL/pgSQL function _timescaledb_internal.chunk_constraint_add_table_constraint(_timescaledb_catalog.chunk_constraint) line 42 at EXECUTE
SQL state: 23514

标签: timescaledb

解决方案


您似乎认为timestamptz存储时区。
这不是真的:没有任何 PostgreSQL 类型timestamptimestamptz存储时区。
他们只是以不同的方式对待输入:请参阅有关这两种类型的详细说明。

一旦你理解了这一点,你可能会发现你不需要转换timestamptimestamptz
当你仍然想转换类型时,那么这个答案可能会有所帮助。


推荐阅读