Oracle中如何将数字格式的hhmmssss转换为指定时间格式?
解决Oracle中数字时间格式转换问题
你的需求是把存储为数字的PROCESS_TIME(格式为hhmmssss,存在7位或8位两种长度)转成带冒号的目标格式,且上午小时无前导0。仅用TO_CHAR函数无法实现,因为数字长度不固定,必须结合字符串处理函数来动态拆分拼接。
具体实现SQL
SELECT PROCESS_TIME, CASE LENGTH(TO_CHAR(PROCESS_TIME)) WHEN 8 THEN -- 8位数字:拆分前2位小时、中间2位分钟、最后4位毫秒,去掉小时前导0 TRIM(LEADING '0' FROM SUBSTR(TO_CHAR(PROCESS_TIME), 1, 2)) || ':' || SUBSTR(TO_CHAR(PROCESS_TIME), 3, 2) || ':' || SUBSTR(TO_CHAR(PROCESS_TIME), 5, 4) WHEN 7 THEN -- 7位数字:拆分第1位小时、第2-3位分钟、第4-7位毫秒 SUBSTR(TO_CHAR(PROCESS_TIME), 1, 1) || ':' || SUBSTR(TO_CHAR(PROCESS_TIME), 2, 2) || ':' || SUBSTR(TO_CHAR(PROCESS_TIME), 4, 4) END AS FORMATTED_PROCESS_TIME FROM 你的表名;
代码说明
- 转字符串处理:先用
TO_CHAR(PROCESS_TIME)把数字转为字符串,方便按固定位置截取内容。 - 区分长度分支:用
LENGTH()判断字符串长度,分别处理7位和8位的数字结构。 - 拆分与拼接:
- 8位数字:前2位是小时,用
TRIM(LEADING '0')去掉小时的前导0(比如09会转为9),再拼接中间2位分钟和最后4位毫秒。 - 7位数字:第1位直接作为小时(本身无前导0),后续截取2位分钟和4位毫秒拼接即可。
- 8位数字:前2位是小时,用
测试结果
用你提供的示例数据验证,输出如下:
| PROCESS_TIME | FORMATTED_PROCESS_TIME |
|---|---|
| 10150450 | 10:15:0450 |
| 2034039 | 2:03:4039 |
完全符合需求格式。
内容的提问来源于stack exchange,提问作者NewJC
相关产品推荐
相关产品推荐

