如何从文本字符串中提取日期
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
我需要从下面没有空格的字符串中提取日期 (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