首页 > 解决方案 > 使用 REGEXP_SUBSTR 从字符串中获取日期值

问题描述

我正在寻找从字符串中获取格式“06-11-2014 - 05-12-2014”或格式“01/11/2019 - 30/11/2019”的日期的 REGEXP_SUBSTR 代码。第一个日期是开始日期,第二个日期是结束日期。了解 REGEXP_SUBSTR 在这种情况下如何工作以及为什么会非常有帮助。我想获取带有两个日期的字符串,但是我希望两个日期都在自己的列中。

记录看起来像这样:

Medium - nl (06-11-2014 - 05-12-2014) ruimte: Standaard (5.000 MB).

尽管文本可以更短或更长,但括号中的两个日期始终存在。

下面的代码获取第一个,但前提是它带有'-'。我希望同时显示 '-' 和 '/' 变体。

REGEXP_SUBSTR(description, '[0-9][0-9][-[0-9][0-9]-[0-9][0-9][0-9][0-9]')

非常感谢您提供的所有帮助。

标签: mysqlregexp-substr

解决方案


由于您使用的是 MySQL 8+,这意味着您也可以访问该REGEXP_REPLACE函数,该函数适用于隔离包含两个日期的字符串部分。在下面的 CTE 中,我隔离了日期字符串,然后在该 CTE 的子查询中,我使用SUBSTRING_INDEX.

WITH cte AS (
    SELECT
        text,
        REGEXP_REPLACE(text, '^.*\(([0-9]{2}-[0-9]{2}-[0-9]{4} - [0-9]{2}-[0-9]{2}-[0-9]{4})\).*$', '$1') AS dates
    FROM yourTable
)

SELECT
    text,
    SUBSTRING_INDEX(dates, ' - ', 1) AS first_date,
    SUBSTRING_INDEX(dates, ' - ', -1) AS second_date
FROM cte;

演示

以下是使用的正则表达式模式的解释:

^                                   from the start of the string
    .*                              match any content, until hitting
    \(                              '(' which is followed by
    (                               (capture what follows)
        [0-9]{2}-[0-9]{2}-[0-9]{4}  a single date
         -                          -
        [0-9]{2}-[0-9]{2}-[0-9]{4}  another single date
    )                               (stop capture)
    \)                              ')'
    .*                              match the remainder of the content
$                                   end of the string

请注意,我们包含一个匹配整个输入的模式,这是一个要求,因为我们想要使用捕获组。另外,请注意,REGEXP_SUBSTR这在此处可能是可行的,但如果日期可能出现在括号中的条款之外的其他地方,则可能会出现误报的风险。


推荐阅读