如何从PostgreSQL中原样获取timestamp时间戳的存储值
问题原因
你的PostgreSQL中存储的是timestamp without time zone类型的UTC时间值,出现格式差异的核心原因是:
- dBeaver客户端查询时,会直接读取该字段的原始字符串存储格式进行展示,不会做额外类型转换
- Node.js的PostgreSQL驱动(pg包)默认会将
timestamp类型的返回值自动转为JS的Date对象,当API序列化返回结果时,Date对象默认调用toISOString()方法,就会生成带T、毫秒位、Z标识的格式。
解决方案
方案1:查询时直接转字符串(最简便,无需修改全局配置)
修改查询语句,使用PostgreSQL内置的to_char函数将时间戳按你需要的原始格式直接转为字符串返回,示例代码如下:
const getQuery = (id) => `SELECT to_char(time_stamp, 'YYYY-MM-DD HH24:MI:SS') AS time_stamp from glacier_restore_progress where id=1`
该方案返回的time_stamp字段直接是字符串类型,和数据库存储的原始值完全一致。
方案2:全局修改pg驱动的类型解析规则
如果你希望所有timestamp without time zone类型的字段都返回原始字符串,无需逐个修改SQL,可以在初始化pg连接前添加类型解析配置:
const { types } = require('pg'); // timestamp without time zone 对应的PostgreSQL内置类型OID为1114 const TIMESTAMP_WITHOUT_TZ_OID = 1114; types.setTypeParser(TIMESTAMP_WITHOUT_TZ_OID, (rawValue) => { // 直接返回原始字符串,不转为Date对象 return rawValue; });
如果你使用的是
timestamp with time zone(timestamptz)类型,对应的OID为1184,修改上述配置中的OID即可,同时建议确认存储的时区和你预期的原始值匹配。
内容的提问来源于stack exchange,提问作者ahkam
相关产品推荐
相关产品推荐

