You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
/

逻辑说明:

  1. 用INSTR定位到hh:mm:ss里的第二个冒号(因为时间格式里有两个冒号),加上2就到了秒数的最后一位
  2. 从这个位置开始找下一个空格,确定时间部分和目标子串的分隔点
  3. 用SUBSTR从分隔点的下一位开始提取,得到我们需要的内容

如果时间后面没有空格(直接跟目标内容),可以简化逻辑,直接从v_time_end_pos + 1开始提取即可。

内容的提问来源于stack exchange,提问作者Vara Mahalakhmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:20:37