如何从JavaScript获取PostgreSQL中时间戳的内部整数表示?
解决JavaScript获取PostgreSQL时间戳整数表示的方法
一、SQL层面的正确转换方式
你之前用SELECT current_timestamp::int8;失败,是因为PostgreSQL不能直接将时间戳强转为bigint,得用专用函数实现:
- 转秒级Unix时间戳:
SELECT EXTRACT(EPOCH FROM current_timestamp)::int8; - 转毫秒级整数:
SELECT (EXTRACT(EPOCH FROM current_timestamp) * 1000)::bigint; - 转PostgreSQL内部微秒级整数(以2000-01-01为基准):
SELECT (DATE_PART('epoch', current_timestamp) * 1000000)::bigint;
二、支持二进制结果格式的JavaScript驱动
不用自己编写或修改驱动,现有成熟驱动已支持二进制模式:
- pg(node-postgres):最常用的纯JS驱动,默认返回文本格式,可在创建客户端/连接池时配置
binary: true开启二进制模式。此时时间戳会以Buffer形式返回,你可以自行解析为整数,不过需要额外处理类型转换逻辑。 - pg-native:基于libpq的原生驱动,天生支持二进制格式,性能优于纯JS驱动,适合对性能要求高的场景,同样可配置返回二进制数据直接处理底层时间戳表示。
三、自定义类型解析器方案
如果不想开启二进制模式,也能在pg驱动中自定义时间戳解析逻辑,自动将文本格式转成整数:
const { types } = require('pg'); // 将OID为1114的timestamp类型解析为毫秒级整数 types.setTypeParser(1114, (val) => { return new Date(val).getTime(); });
配置后,所有查询返回的时间戳列都会自动转为毫秒级整数,无需每次在SQL中手动转换。
内容的提问来源于stack exchange,提问作者msand
相关产品推荐
相关产品推荐

