2012-05-06 33 views
4

雖然轉換和標準化數據從Access數據庫的SQL Server數據庫,我跑過一個有趣的問題:ISDATE()似乎並沒有成功地預測文本是否可以轉換爲日期。如何確定是否文本可以被轉換爲日期?

SELECT 'This will return an error' = 
    CASE 
    WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS date) 
    ELSE NULL 
    END 

我認爲這是有點奇怪,作爲ISDATE() MSDN article指出該函數將返回「1,如果該表達式是有效的日期,時間,或日期時間值;否則,0」。

從我可以告訴,不與任何SET DATEFORMAT或SET LANGUAGE玩減輕這個錯誤。

也不CONVERT()表現爲具有不同的結果CAST()。

幸運的是,ISDATE()確實可以預測文本是否可以轉換爲datetime

SELECT 'This will return a datetime' = 
    CASE 
    WHEN ISDATE('1/1-2010') = 1 THEN CAST('1/1-2010' AS datetime) 
    ELSE NULL 
    END 

所以,我可以使用鑄造日期時間,然後鑄造日期的解決方法。

SELECT 'This will return a date' = 
    CASE 
    WHEN ISDATE('1/1-2010') = 1 THEN CAST(CAST('1/1-2010' AS datetime) as date) 
    ELSE NULL 
    END 

但是,我不知道我是否失去了一些東西。有沒有更簡潔的方式來將文本投射到日期?作爲推論,是ISDATE()函數不在MSDN正確定義(並且實際上因此有點用詞不當的)?

回答

3

IsDate和IsNumeric都不會嘗試將您的值轉換爲相關類型。相反,他們會告訴你,如果有問題值看起來像它可以被轉換爲日期或數字。 SQL Server 2012通過TRY_PARSE函數解決了這個問題。在此期間,您需要對數據進行一些清理或創建一個清理功能。

相關問題