You need to enable JavaScript to run this app. 如何从PostgreSQL中原样获取timestamp时间戳的存储值
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 15:57:01