如何从文本字符串中提取日期

How to extract date from text string

我需要从下面没有空格的字符串中提取日期 (08-01-2021)

select 'Date-08-01-2021-Trans-1000008-PH.0000-BA-CR-9999.21' from dual

我尝试应用 REGEXP_SUBSTR 函数,如下所示,但使用此查询我只是删除了 'Date-'

 with x as
    (select 'Date-08-01-2021-Trans-1000008-PH.0000-BA-CR-9999.21' as str
     from dual)
    SELECT REGEXP_SUBSTR(STR, 'Date-([^ ]+)',1,1,'i',1)
   FROM x;

请指教

只需使用更精确的正则表达式:

SELECT REGEXP_SUBSTR(STR, 'Date-([0-9]{2}-[0-9]{2}-[0-9]{4})', 1, 1, 'i', 1)
FROM x;

或者为了更准确但更简洁:

SELECT REGEXP_SUBSTR(STR, 'Date-([-0-9]{10})', 1, 1, 'i', 1)

您正在对日期值进行零填充,因此每个术语都有固定的长度和固定的前缀,因此您不需要使用(慢速)正则表达式,只需使用简单的字符串函数即可:

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;

输出:

DATE_VALUE
08-JAN-21

db<>fiddle 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<>fiddle here