2015-11-02 31 views
-2

我存储在一个领域中的一些数据称为published。我需要使用正则表达式来匹配Y-m-d的格式。 Y和d可以排除,但是我需要3个月的任何值,例如$months = ['01,'02','03]。我需要匹配在我的正则表达式的任何的3个月,这是我的正则表达式到目前为止:MySQL的REGEXP Y-M-d与多个月

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

我什么语法是换了个不确定。它会像01|02|03?我对正则表达式还不是很好。

更新

我发现下面的正则表达式将匹配: ^([0-9]{4}\-{1}(05|01|03){1}\-{1}[0-9]{2})$不知道,如果它与MySQL兼容,但我要去尝试,看看会发生什么。 http://regexr.com/3c440

回答

0

@FrankerZ回答的作品,但对我们而言领域可以存储任何类型的文本,而不仅仅是一个Y-m-d格式化的日期。该查询的目的是与匹配Y-m-d格式和所有其他人根本不关心这个运动模式的目标只记录。

我能够与完成它自己:

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

http://sqlfiddle.com/#!2/7e311/1

+0

反斜杠括号外的破折号前可选的,并且'{1}'基本上是冗余的。你可以用一个看起来像这样的正则表达式:['^([0-9] {4} - (05 | 01 | 03) - [0-9] {2})$'](http:// regexr.com/3c4iq) – FrankerZ

+0

如果你正在检查确切的正则表达式,你仍然应该使用'STR_TO_DATE'。当你提供格式'%Y-%m-%d'并且它不属于那种格式时,它将返回NULL,并且MONTH(NULL)= NULL,所以'NULL'不在'( 1,3,5)' – FrankerZ

+0

@FrankerZ它通过了我所有的测试用例。函数接受内插入或正则表达式的日期数组。 – r3wt

2

你为什么不只是使用:

WHERE MONTH(`datefield`) IN(1, 2, 3) 

它很容易与日期时间里干活,因为它更容易查找和解析格式转换成可读格式的MySQL可以使用。

搜索范围变得容易:

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

功能的完整列表,可以发现here,您可以使用的功能,如STR_TO_DATE转换为日期格式。

+0

将在需要使用日期字段?我只想使用文本字段。 – r3wt

+0

尽管您很可能想使用日期时间字段以利用索引,但您可以使用STR_TO_DATE将文本字段即时转换为日期时间字段。 – FrankerZ

+0

我无法使用日期时间字段的原因。其他类型的数据可以存储在现场,所以它需要灵活。我需要 – r3wt