我在 PostgreSQL 9.3
ALTER COLUMN
手册页中找到了这个ALTER TABLE
语句:
ALTER TABLE audits
ALTER COLUMN created_at SET DATA TYPE timestamp with time zone
USING
timestamp with time zone 'epoch' + created_at * interval '1 second';
我似乎无法让它工作。我收到这个错误:
ERROR: operator does not exist: timestamp without time zone * interval SQL state: 42883 Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
ALTER TABLE
声明看起来非常直截了当。但是我已经尝试了各种类型的转换和转换列类型,但无法使其正常工作。我错过了什么?
Postgres 手册中的示例(以及 mvp 的工作小提琴)将
integer
列(代表 UNIX 纪元)转换为 timestamptz
.
timestamp
转换为 timestamptz
。这只是自动工作,没有显式转换。
ALTER TABLE test ALTER created_at TYPE timestamptz;
关于
timestamp
与timestamptz
:
timestamp
值始终根据会话的时区设置进行解释。为转换假设时区 UTC:
BEGIN;
SET LOCAL timezone='UTC';
ALTER TABLE test ALTER created_at TYPE timestamptz;
COMMIT;
AT TIME ZONE
结构:
ALTER TABLE test ALTER created_at TYPE timestamptz
USING created_at AT TIME ZONE 'UTC';
你可以这样假设任何时区。但是请考虑将此用于 Postgres 12 或更新版本!
对我来说很好用:SQLFiddle.
我认为您拥有的是 SQL 客户端缓存数据类型。在我重新启动它之前我遇到了这个问题,并且类型确实改变了。