2012-04-26 69 views
3

所以我一直在尋找在SQL Server中的ISDATE()函數的文檔,看到這例子:SQL Server ISDATE()函數 - 有人可以解釋這一點嗎?

SET DATEFORMAT mdy; 
SELECT ISDATE('15/04/2008'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('15/2008/04'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('2008/15/04'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('2008/04/15'); --Returns 1. 

最後一個例子返回1(有效日期),但上述日期格式不對匹配函數表達式中的格式。我認爲這是一個錯誤的文件,但然後好奇地試了一下自己,它確實返回1.

那麼爲什麼是'2008/04/15'日期格式爲mdy時的有效日期?

文檔瀏覽:http://msdn.microsoft.com/en-us/library/ms187347(SQL.105).aspx

+0

它爲我返回'0'。 – 2012-04-26 10:46:47

+0

juergen d:默認語言是什麼? – 2012-04-26 10:48:17

+1

它可能*試圖展示一種始終有效的格式,無論使用何種語言/日期格式設置。當然,在這方面,這是錯誤的(嘗試在查詢之前設置英語語言) – 2012-04-26 10:49:42

回答

3

http://msdn.microsoft.com/en-us/library/ms187347%28SQL.105%29.aspx#SessionSettingDependencies

ISDATE的返回值取決於SET DATEFORMAT ,設置語言和默認語言設置選項中的設置。

因此,如果給定的字符串不適用於設置日期格式,也cecks默認語言選項,允許日期像Y/M/d的格式

+1

可能值得注意的是,SET LANGUAGE也會設置SET DATEFORMAT [(source)](http:/ /msdn.microsoft.com/en-us/library/ms174398.aspx) – Bridge 2012-04-26 11:06:54

3

如果我們設置日期格式,以MDY然後它會驗證對於此格式的所有日期均爲真。

如果發現無效的日期格式爲mdy,則根據語言檢查設置。如果根據語言支持發現有效日期,則返回true否則返回false。

如果用戶A的默認語言爲us_english,則2006年4月6日的日期將被解釋爲2006年4月6日。如果用戶B具有默認語言'British',則會解釋日期作爲2006年6月4日。

/* Use these sessions settings. */ 
SET LANGUAGE us_english; 
SET DATEFORMAT mdy; 
/* Expression in mdy dateformat */ 
SELECT ISDATE('04/15/2008'); --Returns 1. 
/* Expression in mdy dateformat */ 
SELECT ISDATE('04-15-2008'); --Returns 1. 
/* Expression in mdy dateformat */ 
SELECT ISDATE('04.15.2008'); --Returns 1. 
/* Expression in myd dateformat */ 
SELECT ISDATE('04/2008/15'); --Returns 1. 

SET DATEFORMAT mdy; 
SELECT ISDATE('15/04/2008'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('15/2008/04'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('2008/15/04'); --Returns 0. 
SET DATEFORMAT mdy; 
SELECT ISDATE('2008/04/15'); --Returns 1. 

SET DATEFORMAT dmy; 
SELECT ISDATE('15/04/2008'); --Returns 1. 
SET DATEFORMAT dym; 
SELECT ISDATE('15/2008/04'); --Returns 1. 
SET DATEFORMAT ydm; 
SELECT ISDATE('2008/15/04'); --Returns 1. 
SET DATEFORMAT ymd; 
SELECT ISDATE('2008/04/15'); --Returns 1. 

SET LANGUAGE English; 
SELECT ISDATE('15/04/2008'); --Returns 0. 
SET LANGUAGE Hungarian; 
SELECT ISDATE('15/2008/04'); --Returns 0. 
SET LANGUAGE Swedish; 
SELECT ISDATE('2008/15/04'); --Returns 0. 
SET LANGUAGE Italian; 
SELECT ISDATE('2008/04/15'); --Returns 1. 

/* Return to these sessions settings. */ 
SET LANGUAGE us_english; 
SET DATEFORMAT mdy; 

數字格式可以使用破折號( - ),點(。)或斜線(/)作爲分隔符。 SQL Server如何分析字符串的規則不會因分隔符而改變。一個常見的誤解是,ANSI SQL格式(有時候有時被錯誤地稱爲「ISO格式」),1998-02-23,對於smalldatetime和datetime是語言中立的。事實並非如此。它是一種數字格式,因此它是取決於SET DATEFORMAT和SET LANGUAGE設置:

SET LANGUAGE us_english 
SELECT CAST('2003-02-28' AS datetime) 
----------------------- 
2003-02-28 00:00:00.000 

SET LANGUAGE british 
SELECT CAST('2003-02-28' AS datetime) 
Server: Msg 242, Level 16, State 3, Line 4 
The conversion of a char data type to a datetime data type resulted in an out-of-range datetime value. 

請仔細閱讀錯誤消息。它確切地說明了問題所在。您將日期時間值指定爲字符串,並且由於字符串不是根據您使用的格式和DATEFORMAT設置形成的,因此SQL Server無法將字符串轉換爲日期時間值。

+1

值得一提的是,'YYYYMMDD'是一個安全的日期格式,'YYYY-MM-DDThh:mm:ss'是一個安全的日期時間格式其中'T'實際上是字母'T',而不是日期和時間之間的空格) – 2012-04-26 12:28:25

相關問題