使用 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;
这里是对所用正则表达式模式的解释:
^ 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
在这里可能是可行的,但如果日期可能出现在括号中的条款之外的其他地方,它可能 运行 您得到误报的风险。
我正在寻找 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;
这里是对所用正则表达式模式的解释:
^ 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
在这里可能是可行的,但如果日期可能出现在括号中的条款之外的其他地方,它可能 运行 您得到误报的风险。