PostgreSQL计算两个Timestamp毫秒差值遇到的问题
解决PostgreSQL Timestamp毫秒差值计算问题
你的核心问题是SQL语法错误,导致没有正确获取到秒数差值。
你写的语句SELECT * FROM EXTRACT(EPOCH FROM(NOW()::TIMESTAMP - '2022-10-23 16:34:53.227'))是错误的——EXTRACT是标量函数,不需要用FROM子句包裹,这种错误写法会让PostgreSQL无法正确解析,返回的其实是两个时间相减后的interval类型,而不是你期望的秒数值。
正确的写法
直接将EXTRACT作为查询列,不需要FROM:
SELECT EXTRACT(EPOCH FROM (NOW()::TIMESTAMP - '2022-10-23 16:34:53.227'));
这个语句会返回带小数的秒数(比如差值是1.5秒就返回1.5),此时直接乘以1000就能得到毫秒值:
SELECT EXTRACT(EPOCH FROM (NOW()::TIMESTAMP - '2022-10-23 16:34:53.227')) * 1000;
如果需要整数类型的毫秒值,用CAST转换即可:
SELECT CAST(EXTRACT(EPOCH FROM (NOW()::TIMESTAMP - '2022-10-23 16:34:53.227')) * 1000 AS bigint);
为什么之前的转换没用?
因为你之前操作的对象是interval类型,而不是EXTRACT返回的数值类型。当语法错误导致返回interval时,无论转成numeric还是int,本质还是对interval的转换,不是时间差的总毫秒数——而正确获取到EXTRACT的数值结果后,乘法和类型转换都能正常工作。
内容的提问来源于stack exchange,提问作者Yuki
相关产品推荐
相关产品推荐

