使用 REGEXP_SUBSTR 从字符串中获取日期值

Use of REGEXP_SUBSTR to get date values from string

我正在寻找 REGEXP_SUBSTR 代码获取格式为“06-11-2014 - 05-12-2014”或格式“01/11/2019 - 30/11/2019”的日期从一个字符串。第一个日期是开始日期,第二个日期是结束日期。了解 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]')

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

由于您使用的是 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})\).*$', '') AS dates
    FROM yourTable
)

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

Demo

这里是对所用正则表达式模式的解释:

^                                   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

请注意,我们包含了一个匹配 entire 输入的模式,这是一项要求,因为我们要使用捕获组。另外,请注意 REGEXP_SUBSTR 在这里可能是可行的,但如果日期可能出现在括号中的条款之外的其他地方,它可能 运行 您得到误报的风险。