需要修复我的TimescaleDB数据库中的时间戳(提供给TO_TIMESTAMP的秒数不正确,精确到1000倍)

时间:2019-06-26 16:07:32

标签: postgresql timestamp timescaledb

我有一个TimescaleDB数据库,其中多个表中的某些时间戳不正确-我无意中给了TO_TIMESTAMP()函数Unix时间中的毫秒数,而不是秒。因此,自1970年以来,所有这些数据点都比其应有的长1000倍。我可以通过在where子句中检查将来的日期来轻松地确定哪些行需要修复,但是我对如何转换和替换这些不正确的时间戳有些犹豫。我本质上需要获取Unix时间表示形式,将其除以1000,然后在行中替换该值,但是我的SQL太生锈了,无法将该查询组合在一起。

我看到我可以使用extract(epoch from)来获取秒数,但是我不清楚如何对每一行执行此操作然后更新其时间戳。

编辑:

使用查询时:

UPDATE table_name
SET time = TO_TIMESTAMP(extract(epoch from time) / 1000.0)
WHERE
   time > '2020-01-01 00:00:00';

我得到了错误:

  

关系“ _hyper_8_295_chunk”的新行违反了检查约束   “ constraint_295”

1 个答案:

答案 0 :(得分:1)

我认为最好创建一个新的超表,并在从旧的超表到新表的select中运行一个插入操作。或可能分批进行。这是因为Timescale限制了分区键的更新,因此项目不会在分区之间移动。您可以先执行删除操作,再执行插入操作,以使其工作类似,但是比起尝试进行更新等操作,创建一个新的超表,使用正确的时间戳移动所有内容,然后重命名将更加有效。