2013-09-30 16 views
3

我只是想從用戶在t-sql中驗證日期?

Declare @UserInput NVARCHAR(20) 
set @UserInput = '26/07/2013' 
select ISDATE(@UserInput) 

這將返回錯誤的驗證給定輸入的日期是澳大利亞格式,即使日期有效

我最後一行更改爲如下因素

select isdate(CONVERT(datetime, @UserInput, 103)) 

和它的作品。但是如果@Userinput是垃圾(即: - 'hello'),那麼最後一條語句會失敗。我怎樣才能擁有一些東西,無論用戶輸入什麼東西,它都會將其確認爲澳大利亞日期(dd/mm/yyyy)?

感謝

+0

我認爲這樣的驗證應該發生在調用應用程序中,而不是查詢文本中。 – athabaska

+1

請記住,像這樣的驗證不會讓您免於*曖昧的*日期 - 如果您僅收到「2013年4月9日」,您無法知道用戶*是否打算*一天在四月或九月。 –

回答

7

使用SET DATEFORMAT指定您所期待的日期是格式輸入:

SET DATEFORMAT DMY; 

Declare @UserInput NVARCHAR(20) 
set @UserInput = '26/07/2013' 
select ISDATE(@UserInput) 

我會傾向於在輸入到達SQL Server之前執行此類驗證,並確保任何日期變量都是日期。

+0

通過使用set DateFormat它會更改sql安裝的dateformat嗎?還是隻對當前腳本有效? – user2206329

+0

@ user2206329取自鏈接的aticle - '它不影響存儲在數據庫中的日期數據類型值的顯示或存儲格式 –

+1

@ user2206329,從[SET語句](http:// technet.microsoft.com/en-us/library/ms190356.aspx) - 「Transact-SQL編程語言提供了幾個SET語句,用於更改特定信息的當前會話處理。」所以當前的會議是範圍。 – dsolimano

3

假設你正在使用SQL Server 2012及以上版本,你可以使用TRY_CONVERT代替:

select isdate(TRY_CONVERT(datetime, @UserInput, 103))

+1

爲什麼ISDATE檢查...只是檢查TRY_CONVERT返回NULL? –

+0

@ ta.speot.is除了OP最初使用的IsDate(),沒有其他原因,所以我假設他們想要一個真/假的結果。但是,是的,他們可以檢查'Try_Convert'。 – codingbadger