【问题标题】:How to extract date from text string如何从文本字符串中提取日期
【发布时间】:2021-09-25 05:05:04
【问题描述】:

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

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

我尝试应用如下所示的 REGEXP_SUBSTR 函数,但使用此查询我只是删除了“日期-”

 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;

请指教

【问题讨论】:

    标签: sql oracle substring


    【解决方案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小提琴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

    【讨论】:

    • 感谢您的帮助,我应用了 REGEXP_SUBSTR 而不是 SUBSTR,因为日期位置可能在文本的中间,因为它不固定。例如:'1003030405-Value date-03-01-2021-BANK-00009.61-000000.91&22.45-PH.0000'
    • @Maram 如果总是有Date- 前缀,那么你可以使用SUBSTR(value, INSTR(value, 'Date-') + 5, 10),它仍然会比正则表达式更快。
    • 完美,我刚试过你的命令它适用于所有情况
    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多