我正在尝试将表中的列从时间戳(双精度(迁移到日期。
例如,现在seen_timestamp列包含如下值:
1643302746243
现在的值都是UTC
。因此unix时间戳将是:
Thu, 10 Mar 54044 17:04:03 GMT
这是我犯的错误的一部分。时间戳应该是这样的:
1643302746.243
哪个日期:
01/27/2022, 04:59:06 PM
因此,我可以首先通过除以1000来更新所有值,然后迁移到UTC日期类型。。。。
我试过这个:
ALTER TABLE car
ALTER COLUMN seen_timestamp TYPE DATE USING seen_timestamp::DATE;
我得到以下错误:
cannot cast type double precision to date
有道理。我只是不知道如何将列更改/迁移到Date
类型。
我怎样才能做到这一点?
使用适当的USING
子句:
ALTER TABLE car
ALTER COLUMN seen_timestamp TYPE timestamp
USING to_timestamp(seen_timestamp / 1000.0::numeric);
所以我开始工作了。The Impaler
的评论和Laurenz
的回答都有助于朝着正确的方向发展。这就是对我有效的:
-- add new tmp column to store timestamps
ALTER TABLE car ADD COLUMN tmp_seen_timestamp timestamptz;
-- update new column using seen_timestamp values/1000
UPDATE car SET tmp_seen_timestamp=to_timestamp(seen_timestamp / 1000.0::numeric) where seen_timestamp is not null;
-- remove original column
ALTER TABLE car drop column seen_timestamp;
-- raname column...
ALTER TABLE car rename column tmp_seen_timestamp to seen_timestamp;
这也起作用,遵循Laurenz发布的内容:
ALTER TABLE car
ALTER COLUMN seen_timestamp TYPE timestamptz
USING to_timestamp(seen_timestamp / 1000.0::numeric);
这可以满足它的需要,但是,我很困惑为什么使用"日期"作为类型不能提供完全的精度。
如何在postgresql中更新时间戳数据类型
ALTER TABLE[表名称]ALTER COLUMN_NAME]不带时区的TYPE TIMESTAMP