MySQL REGEXP Y-m-d,带多个月

MySQL REGEXP Y-m-d,带多个月,mysql,regex,Mysql,Regex,我将一些数据存储在一个名为published的字段中。我需要使用正则表达式来匹配Y-m-d的格式。可以排除Y和d,但是我需要在3个月的数组中输入任何值,如$months=['01,'02','03]。我需要匹配正则表达式中的3个月中的任意一个,这是我的正则表达式: $regex='^([0-9]{4}\-'.$months.\-[0-9]{2})$ 我不确定这几个月的语法是什么。它会像01 | 02 | 03?我对正则表达式还不是很在行 已更新 我找到了以下匹配的正则表达式: ^([0-9]{4

我将一些数据存储在一个名为
published
的字段中。我需要使用正则表达式来匹配
Y-m-d
的格式。可以排除Y和d,但是我需要在3个月的数组中输入任何值,如
$months=['01,'02','03]
。我需要匹配正则表达式中的3个月中的任意一个,这是我的正则表达式:

$regex='^([0-9]{4}\-'.$months.\-[0-9]{2})$

我不确定这几个月的语法是什么。它会像
01 | 02 | 03
?我对正则表达式还不是很在行

已更新

我找到了以下匹配的正则表达式:
^([0-9]{4}-{1}(05 | 01 | 03){1}-{1}[0-9]{2})$
不确定它是否与mysql兼容,但我将尝试看看会发生什么

为什么不直接使用:

WHERE MONTH(`datefield`) IN(1, 2, 3)
使用datetime字段要容易得多,因为更容易查找并将格式解析为MySQL可以使用的可读格式

搜索范围变得很容易:

WHERE `datefield` >= '2015-01-01' AND `datefield` < '2015-04-01'
其中`datefield`>='2015-01-01'和`datefield`<'2015-04-01'

可以找到完整的函数列表,您可以使用诸如转换为日期格式之类的函数。

@FrankerZ answer有效,但是出于我们的目的,该字段可以存储任何类型的文本,而不仅仅是
Y-m-d
格式的日期。此查询仅针对模式与
Y-m-d
格式匹配的记录,而本练习并不关心所有其他记录

我能够通过以下方式实现这一目标:

SELECT*FROM test WHERE published REGEXP'^([0-9]{4}-{1}(05 | 01 | 03){1}-{1}[0-9]{2})$”


这是否需要使用日期字段?我只想使用一个文本字段。您可以使用
STR_to_DATE
动态地将文本字段转换为datetime字段,尽管您很可能希望使用datetime字段以利用索引。由于某些原因,我不能使用datetime字段。其他类型的数据可以存储在字段中,因此它需要灵活。我需要使用
varchar
field@RickJames那颗心爱的银弹。让我们创建3个新列,以提供设计所需的灵活性。尽管我们可以在一列中完成,但这是一种最佳实践。大多数日期/时间请求都涉及一个“范围”,或者可以重新设置为一个范围。对于性能,范围需要
日期时间
时间戳
。Regexp测试和“月(…)IN…”需要缓慢的表扫描。额外的列使数据更大,因此速度较慢。在括号外的破折号之前,反斜杠是可选的,
{1}
基本上是多余的。您可以使用如下的正则表达式:如果您正在检查确切的正则表达式,您仍然应该使用
STR\u TO\u DATE
。当您提供的格式
%Y-%m-%d
不属于该格式时,它将返回
NULL
,并且
MONTH(NULL)=NULL
因此
NULL
不在
(1,3,5)
@FrankerZ中,它通过了我的所有测试用例。函数接受一个日期数组,该数组内爆为正则表达式的or语句。