需要修复我的 TimescaleDB 数据库中的时间戳(提供给 TO_TIMESTAMP 的秒数不正确,正好是 1000 倍)
Need to fix timestamps in my TimescaleDB database (the number of seconds provided to TO_TIMESTAMP was incorrect by exactly a factor of 1000)
我有一个 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';
我收到错误:
new row for relation "_hyper_8_295_chunk" violates check constraint
"constraint_295"
我认为最好创建一个新的超表并 运行 从旧的超表到新的 select 的插入。或者可能分批进行。这是因为时间刻度限制了分区键的更新,因此项目不会在分区之间移动。您可以先删除然后插入以使其工作类似,但是创建一个新的超表,使用正确的时间戳移动所有内容然后重命名比尝试更新等更有效
我有一个 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';
我收到错误:
new row for relation "_hyper_8_295_chunk" violates check constraint "constraint_295"
我认为最好创建一个新的超表并 运行 从旧的超表到新的 select 的插入。或者可能分批进行。这是因为时间刻度限制了分区键的更新,因此项目不会在分区之间移动。您可以先删除然后插入以使其工作类似,但是创建一个新的超表,使用正确的时间戳移动所有内容然后重命名比尝试更新等更有效