【问题标题】:Use of REGEXP_SUBSTR to get date values from string使用 REGEXP_SUBSTR 从字符串中获取日期值
【发布时间】:2020-08-21 16:19:28
【问题描述】:

我正在寻找 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]')

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

【问题讨论】:

  • 如果代码REGEXP_SUBSTR(ii.description, '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9].-.[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]')带有'-'字符,则获取整个字符串。

标签: mysql regexp-substr


【解决方案1】:

由于您使用的是 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;

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

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

【讨论】:

  • 嗨蒂姆,谢谢你的回答。你能解释一下 regexp_replace 代码吗? ^.*\ 做什么?和).*$', '$1'?我也想了解它背后的逻辑。 :-)
  • 非常感谢您描述逻辑。我认为你不仅帮助了我,还帮助了​​我之后的其他人。
猜你喜欢
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多