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

Postgresql 需要修复TimescaleDB数据库中的时间戳(提供给\u时间戳的秒数不正确,精确到1000倍),postgresql,timestamp,timescaledb,Postgresql,Timestamp,Timescaledb,我有一个TimescaleDB数据库,其中跨多个表的一些时间戳不正确-我无意中给了TO_TIMESTAMP()函数Unix时间中的毫秒数,而不是秒数。因此,自1970年以来,所有这些数据点的长度都是其应有长度的1000倍。我可以在where子句中通过检查将来的日期很容易地确定这些行中的哪一行需要被修复,但是我对如何转换和替换这些不正确的时间戳有点困惑。我基本上需要获得unix时间表示,将其除以1000,然后替换行中的值,但是我的SQL太生疏了,无法将此查询组合在一起 我知道我可以使用extrac

我有一个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';
我得到一个错误:

关系“\u hyper\u 8\u 295\u chunk”的新行违反了检查约束 “约束条件_295”


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

到目前为止,您做了哪些尝试?我想在
UPDATE blah SET blahblah=TO_TIMESTAMP(extract(…)/1000)
上的一些变化应该会起作用。我已经更新了我的问题,指定这是一个timescaleDB数据库,但是当我尝试时,我得到了以下错误:关系的新行“_hyper_8_295_chunk”违反了检查约束“constraint_295”的定义是什么“constraint_295”?您当前不能以导致数据在块之间“移动”的方式更新数据(并且当您在放置时更新数据时,它将违反块上指定每个块所覆盖时间范围的“约束”)。相反,您可以在单个事务中以选择、删除、插入包装的方式执行此操作。。。(此处为Timescale person)@jmelesky这是TimescaleDB创建的一个约束,用于出于性能原因将数据保留在正确的时间块中。