dbms_utility.get_time 返回自会话启动以来的百分之一秒整数,仅适用于相对耗时测量,不能获取当前毫秒时间戳;应使用 systimestamp 获取带毫秒的绝对时间。
dbms_utility.get_time 返回的是自会话启动以来的百分之一秒(即 10 毫秒)整数,不是当前系统时间戳,也不带时区信息,不能直接用于“获取当前毫秒时间”,仅适合做**相对耗时测量**。
DBMS_UTILITY.GET_TIME 返回值单位是 10 毫秒,不是 1 毫秒
该函数返回 NUMBER 类型整数,单位是“百分之一秒”(centisecond),即每 1 单位 = 10 毫秒。它不提供绝对时间,只反映从会话开始到调用时刻的累计计时器值。
- 调用两次
DBMS_UTILITY.GET_TIME相减,得到的是中间操作耗时(单位:10 毫秒),例如结果为123表示约 1230 毫秒 - 无法转换成
YYYY-MM-DD HH24:MI:SS.FF格式的时间字符串 - 不同会话之间数值不可比,重启会话后计数重置
为什么不能用 DBMS_UTILITY.GET_TIME 获取“当前毫秒时间戳”
它和 SYSTIMESTAMP 完全不同源:DBMS_UTILITY.GET_TIME 是 Oracle 内部轻量计时器,精度有限且无时间基准;而 SYSTIMESTAMP 来自操作系统时钟,带时区、支持纳秒级(实际通常微秒精度),才是获取当前带毫秒时间的正解。
- 试图用
DBMS_UTILITY.GET_TIME推算 Unix 毫秒时间戳(如 1745827104842)必然失败——它没有起点锚定 - 若强行映射:需先用
SYSTIMESTAMP记录一个基准点,再叠加GET_TIME增量,但误差会随会话运行时间增大 - 跨会话或长连接场景下,
GET_TIME累计值可能溢出(最大约 2^31 ≈ 24.8 天)
真正需要毫秒级当前时间,应该用 SYSTIMESTAMP 而非 GET_TIME
如果你的目标是“记录某条数据插入时的精确时间”,或者“生成 ISO 格式含毫秒的时间字符串”,请直接使用 SYSTIMESTAMP 及其格式化函数:
- 获取带毫秒的字符串:
TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS.FF3')(FF3表示取前 3 位毫秒) - 存入
TIMESTAMP(3)字段时,直接写SYSTIMESTAMP即可,无需转换 - 计算两个时间点毫秒差:用
(t2 - t1) * 24 * 60 * 60 * 1000,其中t1、t2是TIMESTAMP类型值
注意:SYSDATE 不含毫秒,SYSTIMESTAMP 才是唯一可靠选择;某些旧客户端(如 SQL*Plus 默认设置)可能截断毫秒显示,需确认 NLS 设置或显式 TO_CHAR。
DBMS_UTILITY.GET_TIME 的合理使用场景只有性能粗测
它轻、快、无上下文依赖,适合在存储过程中快速评估某段 PL/SQL 执行耗时,比如调试慢查询或函数性能瓶颈:
DECLARE
t1 NUMBER;
t2 NUMBER;
BEGIN
t1 := DBMS_UTILITY.GET_TIME;
-- 这里放待测代码,如大量 INSERT 或复杂循环
t2 := DBMS_UTILITY.GET_TIME;
DBMS_OUTPUT.PUT_LINE('耗时约 ' || (t2 - t1) * 10 || ' 毫秒');
END;
但要注意:这个值受 CPU 调度、IO 等影响,单次测量意义有限;多次取平均才稍可靠;且无法替代 SYSTIMESTAMP 做时间标记。
真正要记“此刻”,别碰 GET_TIME —— 它不是钟表,只是秒表。











