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
相关产品推荐
相关产品推荐

