最近遇到一个问题,分析API的日志,其中重要的部分是分析API响应时间,其中涉及到计算 Timestamp的时间差,精确到毫秒,搜了到的方法大多都是现将 Timestamp转换成字符串,截取后在分别转换成日期,数字进行计算,十分复杂,而且有的方案并不正确。其实从Oracle 9i起我们有一个很方便的函数可以进行此类运算 extract()函数 函数
extract()函数 用于从一个date或者interval类型中截取到特定的部分
用法:
extract (
{ year | month | day | hour | minute | second }
| { timezone_hour | timezone_minute }
| { timezone_region | timezone_abbr }
from { date_value | interval_value } )
我们看一下在实际使用中获取到毫秒级的时间差
SELECT EXTRACT(SECOND FROM(T.END_TIME - T.START_TIME)) * 1000
FROM LOG_T T
这样就可以获取到了
注意:以上方法只能获取到 60 秒内的毫秒差,大于 60 秒的会以 60 秒(分钟) 取余后返回,例如 时间差 119 秒,则 返回 59000 ms ,感谢 qq_21892821 的反馈。
即 在 EXTRACT() 函数中 SECOND By MINUTE取余,MINUTE By HOUR取余,HOUR By DAY取余后返回结果,所以如果有长时间跨度的时间差,可以根据实际情况决定如何累加 日,时,分,秒的差值,实现获取毫秒级的时间差。以下为 时差大于一天的计算方法。
SELECT (EXTRACT(DAY FROM(T.END_TIME - T.START_TIME)) * 24 * 60 * 60 * 1000 +
EXTRACT(HOUR FROM(T.END_TIME - T.START_TIME)) * 60 * 60 * 1000 +
EXTRACT(MINUTE FROM(T.END_TIME - T.START_TIME)) * 60 * 1000 +
EXTRACT(SECOND FROM(T.END_TIME - T.START_TIME)) * 1000) AS MILLISECONDS_DIFF
FROM LOG_T T;
这个文章是参考 oracle中extract()函数----用于截取年、月、日、时、分、秒 更详细的说明可以查看该文章