您正在对日期值进行零填充,因此每个术语都有固定的长度和固定的前缀,因此您不需要使用(慢速)正则表达式,只需使用简单的字符串函数:
SELECT TO_DATE(SUBSTR(value, 6, 10), 'DD-MM-YYYY')
FROM table_name;
(注意:如果您仍希望将其作为字符串而不是日期,则只需使用 SUBSTR 而不将其包装在 TO_DATE 中。)
例如:
WITH table_name ( value ) AS (
SELECT 'Date-08-01-2021-Trans-1000008-PH.0000-BA-CR-9999.21' FROM DUAL
)
SELECT TO_DATE(SUBSTR(value, 6, 10), 'DD-MM-YYYY') AS date_value
FROM table_name;
输出:
db小提琴here
如果Date- 前缀并不总是在开头,那么使用INSTR 来查找它:
WITH table_name ( value ) AS (
SELECT 'Date-08-01-2021-Trans-1000008-PH.0000-BA-CR-9999.21' FROM DUAL UNION ALL
SELECT 'Trans-1000008-Date-08-02-2021-PH.0000-BA-CR-9999.21' FROM DUAL
)
SELECT TO_DATE(SUBSTR(value, INSTR(value, 'Date-') + 5, 10), 'DD-MM-YYYY') AS date_value
FROM table_name;
哪些输出:
| DATE_VALUE |
| 08-JAN-21 |
| 08-FEB-21 |
如果您可以有多个 Date- 子字符串,并且您想找到位于字符串开头或具有 - 前缀的子字符串,那么您可能需要正则表达式:
WITH table_name ( value ) AS (
SELECT 'Date-08-01-2021-Trans-1000008-PH.0000-BA-CR-9999.21' FROM DUAL UNION ALL
SELECT 'TransDate-1000008-Date-08-02-2021-PH.0000-BA-CR-9999.21' FROM DUAL
)
SELECT TO_DATE(
REGEXP_SUBSTR(value, '(^|-)Date-(\d\d-\d\d-\d{4})([-.]|$)', 1, 1, 'i', 2),
'DD-MM-YYYY'
) AS date_value
FROM table_name;
db小提琴here