mysql - 使用 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]')
非常感谢您提供的所有帮助。
解决方案
由于您使用的是 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
这在此处可能是可行的,但如果日期可能出现在括号中的条款之外的其他地方,则可能会出现误报的风险。
推荐阅读
- c# - Unity SetParent 以意想不到的方式缩放
- java - 为什么我的 JLabel 不能在循环中正确更新?
- python - 简单的 TensorFlow 线性回归返回“不能将序列乘以非整数”ValueError
- postgresql - 将星期几与星期几的字符串文字名称进行比较返回 false
- javascript - 不支持 MIME 类型 ('text/html') 尝试了所有解决方案
- mysql - 在mysql中以相反顺序显示的记录
- core-data - 是否可以在 SwiftUI 中为 Core Data 支持的 .listStyle(GroupedListStyle()) 实现 .onDelete 和 .onMove 功能?
- php - 好友请求 SQL 语句 OR 运算符不工作
- xamarin.forms - TabbedPage 中的两个选项卡不是全宽,而是限制在选项卡左角的文本宽度
- java - Json同名序列化和反序列化