在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题

Posted

技术标签:

【中文标题】在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题【英文标题】:Trouble running MySQL REGEXP_SUBSTR within STR_TO_DATE to extract date from text 【发布时间】:2021-05-21 11:47:25 【问题描述】:

我在 STR_TO_DATE 中运行 mysql REGEXP_SUBSTR 以从文本字段中提取日期时遇到问题。

如果可以运行以下查询,并使用 REGEXP_SUBSTR 正确提取日期字符串。

SELECT REGEXP_SUBSTR('12/9/97 - Ependymoma!', '[0-9]1,2/[0-9]1,2/[0-9]1,2');
# '12/9/97'

如果我在 STR_TO_DATE 中硬编码日期字符串,我可以正确地将日期字符串转换为 DATE。

SELECT STR_TO_DATE('12/9/97', '%m/%d/%y');
# '1997-12-09'

但是,如果我在 STR_TO_DATE 中调用 REGEXP_SUBSTR,它会返回 NULL。

SELECT STR_TO_DATE(REGEXP_SUBSTR('12/9/97 - Ependymoma!', '[0-9]1,2/[0-9]1,2/[0-9]1,2'), '%m/%d/%y');
# NULL

我一直在为此苦苦挣扎。任何方向将不胜感激。 谢谢。

【问题讨论】:

未转载。 dbfiddle.uk/… 我还在 MySQL 8.0 的本地实例上进行了测试,它可以工作。它不返回 NULL。 SELECT VERSION(); 会为您返回什么? SELECT VERSION() -> 8.0.12,在 Mac 上运行。谢谢。 尝试先将日期选择到局部变量中SELECT @tmp := REGEXP_SUBSTR('12/9/97 - Ependymoma!', '[0-9]1,2/[0-9]1,2/[0-9]1,2')SELECT STR_TO_DATE(@tmp, '%m/%d/%y') 【参考方案1】:

尝试先将日期选择到局部变量中

SELECT @tmp := REGEXP_SUBSTR('12/9/97 - Ependymoma!', '[0-9]1,2/[0-9]1,2/[0-9]1,2')
SELECT STR_TO_DATE(@tmp, '%m/%d/%y');

也发布为answer 因为我无法让comment 显示两行,所以一团糟

顺便说一句:您原来的合并语句适用于 10.4.8-MariaDB

【讨论】:

谢谢。我尝试了局部变量,但没有奏效。诡异的。 Akina 的 dbfiddle 也有效。 这很奇怪,因为这两个语句是分开工作的,有常量。我想知道这是否与转换字符集有关?如果在两者之间添加select @tmp 会发生什么?另外,当你说it didn't work 发生了什么时,又是NULL 是的,如果不工作,它只会返回 NULL。我已经尝试了命令行和 MySQL 工作台,但没有成功。在两者之间使用 @tmp 也不起作用。感谢大家的帮助!我尝试了 PostgreSQL 的等效操作,没有任何问题。【参考方案2】:

感谢大家的帮助!一些评论者对我的代码没有任何问题,但我无法让它在我最近安装的 MySQL 版本中工作。我必须完成这项工作,所以我切换到 PostgreSQL 并且没有任何问题。

【讨论】:

以上是关于在 STR_TO_DATE 中运行 MySQL REGEXP_SUBSTR 以从文本中提取日期时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

mysql 之 str_to_date ()函数 和date_format()函数

mysql 之 str_to_date ()函数 和date_format()函数

MYSQL中str_to_date函数的用法

STR_TO_DATE() 从正确的格式返回错误的数据

str_to_date 更改年份数据 MySQL

MySQL STR_TO_DATE函数