Oracle PL/SQL中如何获取hh:mm:ss格式后的子字符串?
如何在Oracle PL/SQL中提取hh:mm:ss格式之后的子串
嘿,这个需求其实挺容易实现的,我给你分享两种在Oracle PL/SQL里常用的解决办法,你可以根据自己的场景选择:
方法一:使用正则表达式函数REGEXP_SUBSTR
正则表达式是处理这类字符串提取问题的利器,我们可以直接匹配hh:mm:ss格式的时间,然后捕获它后面的所有内容:
DECLARE v_input_str VARCHAR2(200) := 'Rajiv Verma 3/20/2018 3:48:39 Tom has told me to comment here'; v_result_str VARCHAR2(200); BEGIN -- 正则匹配hh:mm:ss并捕获后续内容 v_result_str := REGEXP_SUBSTR(v_input_str, '\d{1,2}:\d{2}:\d{2}\s*(.*)', 1, 1, NULL, 1); DBMS_OUTPUT.PUT_LINE(v_result_str); -- 输出结果:Tom has told me to comment here END; /
正则表达式说明:
\d{1,2}:\d{2}:\d{2}:匹配hh:mm:ss格式的时间(小时可以是1位或2位)\s*:匹配时间后面的任意数量空格(包括0个)(.*):捕获时间及空格之后的所有内容- 最后一个参数
1:指定提取第一个捕获组的内容(也就是(.*)匹配到的部分)
方法二:使用INSTR和SUBSTR组合
如果你的环境对正则表达式的支持有限,或者更倾向于使用基础字符串函数,这种方法也很可靠:
DECLARE v_input_str VARCHAR2(200) := 'Rajiv Verma 3/20/2018 3:48:39 Tom has told me to comment here'; v_time_end_pos NUMBER; v_space_after_time_pos NUMBER; v_result_str VARCHAR2(200); BEGIN -- 找到hh:mm:ss中第二个冒号的位置(秒数前的冒号) v_time_end_pos := INSTR(v_input_str, ':', 1, 2) + 2; -- 加2是跳过秒数的两位数字 -- 找到时间之后的第一个空格位置 v_space_after_time_pos := INSTR(v_input_str, ' ', v_time_end_pos); -- 提取空格之后的所有内容 v_result_str := SUBSTR(v_input_str, v_space_after_time_pos + 1); DBMS_OUTPUT.PUT_LINE(v_result_str); -- 输出结果:Tom has told me to comment here END; /
逻辑说明:
- 用
INSTR定位到hh:mm:ss里的第二个冒号(因为时间格式里有两个冒号),加上2就到了秒数的最后一位 - 从这个位置开始找下一个空格,确定时间部分和目标子串的分隔点
- 用
SUBSTR从分隔点的下一位开始提取,得到我们需要的内容
如果时间后面没有空格(直接跟目标内容),可以简化逻辑,直接从v_time_end_pos + 1开始提取即可。
内容的提问来源于stack exchange,提问作者Vara Mahalakhmi
相关产品推荐
相关产品推荐

