2017-09-21 61 views
2

我正嘗試在SQL Server中執行正則表達式以匹配MM/YY格式的VARCHAR字符串。Microsoft SQL Server中mm/yy的正則表達式

我已經試過

WHERE ExpiryDate LIKE '[0-9][0-9]/[0-9][0-9]' 

,讓不正確的日期一樣30/18

我也試過

WHERE ExpiryDate LIKE '0[1-9]|1[012]/[0-3][0-9]' 

但SQL Server不接受管道分開,OR運算符。

我需要一個月的匹配01 - 12

我可以做

WHERE ExpiryDate LIKE '0[1-9]/[0-9][0-9]' 
    OR ExpiryDate LIKE '10/[0-9][0-9]' 
    OR ExpiryDate LIKE '11/[0-9][0-9]' 
    OR ExpiryDate LIKE '12/[0-9][0-9]' 

但我寧願它是正則表達式中。

在此先感謝您的幫助。

+1

您可以嘗試將字符串解析爲日期,然後使用日期函數 –

+1

_「我希望它在正則表達式內_」使用正確的工具。 Date函數和cast可以驗證日期。我知道使用電錘鑽很酷,但在面對釘子時使用常規錘。 –

+0

您無法將30/18轉換爲日期,因此我試圖將其過濾爲有效的MM/YY格式,以便我可以將它們轉換爲日期並根據它們進行查詢。 –

回答

1

如果需要convalidate日期,你可以嘗試這樣的事:

SET DATEFORMAT dmy 
;WITH A AS (SELECT '18/12' AS EXPDATE UNION ALL SELECT '10/17' UNION ALL SELECT 'x2/16') 
SELECT *, ISDATE('01/'+EXPDATE) AS CHK FROM A 

輸出:

EXPDATE CHK 
18/12 0 
10/17 1 
x2/16 0 
+0

我第一次做MM/DD。然後我看到你問MM/YY。答覆已更改。 – etsa

2

如果2012+,你可以使用try_convert()至到期字符串轉換成一個約會。如果轉換失敗,Try_Convert()將返回一個NULL值。

Declare @YourTable table (ID int, ExpiryDate varchar(25)) 
Insert Into @YourTable values 
(1,'09/17') 
,(2,'30/17') 


Select * 
From @YourTable 
Where try_convert(date,replace(ExpiryDate,'/','/01/')) >= '2017-09-01' 
-- Where try_convert(date,replace(ExpiryDate,'/','/01/')) is null 

返回

ID ExpiryDate 
1 09/17 
0
date LIKE '0[1-9]/[0-9][0-9]' OR 
date LIKE '1[0-2]/[0-9][0-9]' 

要短得多。但沒有|很難製作變體......注意,LIKE不需要正則表達式,但wildcards

不要忘記,'[1-9]/[0-9] [0-9]'也會發生。和其他變體,內部空間等。如果您在使用月份格式時不確定,並且不依賴於高速,請使用@JohnCampeletti變體。