2015-11-02 74 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