如何在更新中将bigint转换为带有postgres中时区的时间戳

时间:2019-01-15 05:47:37

标签: sql postgresql datetime

在Postgres中是否可以将BIGINT转换为TIMESTAMPTIMESTAMP 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

我需要将默认值传递给演员吗?

3 个答案:

答案 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;

Demo

答案 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;