You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Postgres中如何将Timestamp毫秒部分从三位截断为两位?

解决Timestamp转TEXT时截断毫秒为两位的问题

嘿,这个需求很常见,我给你分享两个简单靠谱的解决方法:

方法1:直接对格式化后的字符串做截取

既然你已经能输出带三位毫秒的完整字符串,咱们直接把多余的那一位毫秒截掉就行。举个例子:

-- 用substring拆分拼接
SELECT 
  SUBSTRING(to_char(input_timestamp, 'YYYY-MM-DD HH:MI:SS.MS AM'), 1, 22) 
  || SUBSTRING(to_char(input_timestamp, 'YYYY-MM-DD HH:MI:SS.MS AM'), 26);

-- 或者用left+right更简洁
SELECT 
  LEFT(to_char(input_timestamp, 'YYYY-MM-DD HH:MI:SS.MS AM'), 22) 
  || RIGHT(to_char(input_timestamp, 'YYYY-MM-DD HH:MI:SS.MS AM'), 3);

原理很简单:YYYY-MM-DD HH:MI:SS.占20个字符,加上两位毫秒就是22位,后面从第26位开始是AM/PM部分,把这两部分拼起来就得到想要的结果了。

方法2:先处理Timestamp再格式化

如果不想碰字符串操作,咱们可以先把原Timestamp的毫秒截断到两位,再格式化输出:

SELECT 
  to_char(
    date_trunc('milliseconds', input_timestamp) 
    - MOD(EXTRACT(milliseconds FROM input_timestamp)::INT, 10) * INTERVAL '1 millisecond',
    'YYYY-MM-DD HH:MI:SS.MS AM'
  );

这个方法的思路是:先用date_trunc把时间精确到毫秒级,再通过MOD计算出最后一位毫秒的数值,把这部分时间减掉,这样处理后的Timestamp本身就只有两位有效毫秒,格式化出来的结果自然就是两位啦。

效果示例

假设你的输入Timestamp是2020-07-30 22:45:23.638,用上面任意一种方法,都会输出:2020-07-30 10:45:23.63 PM

内容的提问来源于stack exchange,提问作者Mano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:53:01