2016-08-29 33 views

回答

1

一般 - 如果有的話可能:

你應該避免文化特定的日期/時間文字和更好地使用適當的數據類型!

你的問題有所有SQL Server提供了可能的格式沒有純回答:一個日期01/13/2016處於mdy文化有效的,但是是無效的,如果文化是dmy。更加危險的是:如果日期是03/05/2016它是有效的,但是你會得到不同的值...

在沒有像03/05/08這樣的年份的格式中,你會有純粹的混亂。

你可能會與此

select * from sys.syslanguages 

我想告訴什麼提取細節:您要知道,你必須指定文化。永遠不要依賴任何隱式投射!即使檢查的有效日期可能是錯誤的輸入...

但是你運氣不錯,因爲你正在使用SQL Server 2012.有新的TRY_PARSE and TRY_CONVERT您可以在其中指定目標文化。如果演員失敗,您將獲得有效的日期/時間或NULL

在鏈接頁面,你還會發現TRY_CONVERT在那裏你可以指定通過style格式...

入住這apporach與TRY_CONVERT

declare @dateofbirth varchar(max)='12/13/2016'; 
declare @dateofbirth_flag bit; 

SET @dateofbirth_flag=CASE WHEN TRY_CONVERT(date,@dateofbirth,101) IS NULL THEN 0 ELSE 1 END 
SELECT @dateofbirth_flag 

--The result: `1` for style `101`  

SET @dateofbirth_flag=CASE WHEN TRY_CONVERT(date,@dateofbirth,102) IS NULL THEN 0 ELSE 1 END 
SELECT @dateofbirth_flag 

--The result: `0` for style `102`  
+0

謝謝你,這麼明確的解釋,是其有權指定文化,但是當我從一個過時的Excel文件導入數據我必須採取所有可能的日期格式護理。 –

+1

@SiddharthBhardwaj好吧,那可能是一團糟......一個想法:如果日期是給定Excel-Context中的有效日期,那麼可以使用Excel-Formula以definit格式生成字符串文字... – Shnugo

1

可以使用try_convert功能,爲您的方案像這樣,

在可變檢查的情況下

SELECT try_convert(DATE, @dateofbirth) 
WHERE try_convert(DATE, @dateofbirth) IS NOT NULL 

在表的情況下

SELECT * 
FROM yourtable 
WHERE try_convert(DATE, datecolumnname) IS NOT NULL 
+0

如果存在在國際環境中運行應用程序的最小機會,您絕不應該依賴默認文化,尤其是如果OP希望爲SQL Server提供的所有可能格式提供解決方案* ... – Shnugo

相關問題