Node.js写入QuestDB时Timestamps显示为1970年问题咨询
问题根本原因
Date.now()返回的是毫秒级的数值型Unix时间戳,插入环节的类型适配出错触发了时间计算异常,最终显示为1970年,常见的两种适配问题如下:
- 你使用的数据库(此处为QuestDB)的TIMESTAMP类型默认要求传入秒级Unix时间戳、微秒级时间戳或者标准日期对象,直接传入毫秒级数值会被按错误精度解析,计算后的时间接近1970年
- Node.js的pg客户端不会自动将数值型时间戳转换为数据库兼容的TIMESTAMP格式,部分场景下大数值的毫秒时间戳会被截断为32位整数,溢出后数值接近0,对应时间就是1970年
可行解决方案
你可以任选以下一种方案修改:
- 直接传入Date对象而非数值:将参数中的
Date.now()替换为new Date(),pg客户端会自动将Date对象序列化为符合数据库要求的TIMESTAMP格式,无需手动处理精度
const insertData = await client.query( "INSERT INTO measurements VALUES($1, $2, $3);", [new Date(), sensor_id, sensor_reading], )
- 按数据库精度转换时间戳数值:如果需要手动传入数值时间戳,根据字段精度调整:
- 字段为秒级TIMESTAMP:
Date.now() / 1000 - 字段为QuestDB默认微秒级TIMESTAMP:
Date.now() * 1000
- 字段为秒级TIMESTAMP:
- 直接使用数据库侧生成的时间:修改SQL语句直接调用数据库内置的当前时间函数,可同时避免客户端与服务端时钟不一致的问题
const insertData = await client.query( "INSERT INTO measurements VALUES(now(), $1, $2);", [sensor_id, sensor_reading], )
额外优化建议
你当前代码中没有手动开启事务的BEGIN语句,pg客户端默认开启自动提交,额外执行的COMMIT语句属于冗余操作,可以删除。
内容的提问来源于stack exchange,提问作者BurningFlan
相关产品推荐
相关产品推荐

