在Postgres中是否可以将BIGINT
转换为TIMESTAMP
或TIMESTAMP WITH TIME ZONE
?我需要将数据从BIGINT
列复制到TIMESTAMP
列。
这是我尝试过的:
update table
set date__timestamp = date__bigint::timestamp
where foo = 1;
错误:无法将类型bigint强制转换为没有时区的时间戳
我将timestamp列更改为with timezone列,并尝试了以下方法:
update table
set date__timestamp = date__bigint::timestamp with time zone at time zone 'PST'
where foo = 1;
错误:无法将类型bigint强制转换为带有时区的时间戳
update table
set date__timstamp = TO_CHAR(TO_TIMESTAMP(date__bi / 1000), 'DD/MM/YYYY HH24:MI:SS')
where foo = 1;
错误:列“ date__timestamp”的类型为时间戳,没有时区 但表达式的类型为文本提示:您将需要重写或强制转换 表达式。
数据看起来像这样。
date_bigint: 20181102
date_timestamp: 2018-11-02 17:00:00.000000
我需要将默认值传递给演员吗?
答案 0 :(得分:3)
您可以将其转换为文本并使用TO_TIMESTAMP
并将其转换为timestamp at time zone
SELECT
to_timestamp ( '20181102'::bigint::text,'YYYYMMDD')::timestamp at time zone 'UTC'
at time zone 'PST' ;
update t
set date__timestamp = TO_TIMESTAMP(date_bigint::text,'YYYYMMDD')::timestamp
at time zone 'UTC' at time zone 'PST'
where foo = 1;
答案 1 :(得分:1)
此答案假定date__bigint
列存储的是epoch以来的UNIX时间戳(以秒为单位)。这是转换为Postgres时间戳的一种方法:
UPDATE your_table
SET date__timestamp = TIMESTAMP 'epoch' + date__bigint * INTERVAL '1 second'
WHERE foo = 1;
也就是说,我们可以在纪元时间戳中添加一些秒数,以将您的值转换为正式的Postgres时间戳。
答案 2 :(得分:0)
更简单的方法是将 bigint更改为varchar ,然后将 varchar更改为时间戳
alter table tablename alter column colname type varchar(30) USING colname::varchar;
然后
alter table tablename alter column colname type timestamp USING colname::timestamp;