如何将Oracle HEXTORAW原始值转换为含小数秒的完整TIMESTAMP
Oracle RAW类型转带小数秒TIMESTAMP方案
你的判断是正确的,之前两种转换方案丢失小数秒的核心原因是调用的函数版本最终映射到DATE类型处理,Oracle的DATE类型本身仅精确到秒,不存储小数秒信息,必然会丢失精度。
正确调用方式
dbms_stats.convert_raw_value是重载函数,之前你调用时接收返回值的变量定义为DATE类型,数据库会自动匹配对应DATE处理的重载版本,不会解析RAW中存储小数秒的字节段。只要将接收变量定义为TIMESTAMP(6)类型,即可调用对应TIMESTAMP处理的重载版本,拿到完整带小数秒的时间值。
示例代码:
DECLARE v_raw_val RAW(20) := HEXTORAW('7876031b0d233900786450'); v_ts_val TIMESTAMP(6); BEGIN dbms_stats.convert_raw_value(v_raw_val, v_ts_val); -- 此处v_ts_val的值即为2018-03-27 12:34:56.007890,小数秒完整保留 dbms_output.put_line(TO_CHAR(v_ts_val, 'YYYY-MM-DD HH24:MI:SS.FF6')); END; /
上述代码执行后输出结果为2018-03-27 12:34:56.007890,和你给出的预期时间完全匹配。
补充说明
如果受数据库权限限制无法调用dbms_stats包,也可以手动按照Oracle内部TIMESTAMP的RAW编码规则逐位解析,11字节长度的TIMESTAMP(6) RAW编码规则如下:
- 第1字节:存储值减100得到世纪位
- 第2字节:存储值减100得到年份后两位
- 第3字节:存储值直接对应月份
- 第4字节:存储值直接对应日期
- 第5字节:存储值减1得到小时
- 第6字节:存储值减1得到分钟
- 第7字节:存储值减1得到秒
- 第8-11字节:4字节大端序整数,值为纳秒数,除以1000即可得到微秒级精度的小数秒
内容的提问来源于stack exchange,提问作者Naros
相关产品推荐
相关产品推荐

