SQL Server ISDATE()函数 - 有人可以解释一下吗?

时间:2012-04-26 10:44:04

标签: sql-server function date-formatting

所以我在查看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

2 个答案:

答案 0 :(得分:5)

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

  

ISDATE的返回值取决于SET设置的设置   DATEFORMAT,SET LANGUAGE和默认语言选项。

因此,如果给定的字符串不适用于set dateformat,它也会使用默认语言选项,该选项允许日期格式为y / m / d

答案 1 :(得分:4)

如果我们将DateFormat设置为mdy,那么它将以这种格式验证所有日期的真实性。

如果根据mdy发现无效的日期格式,则根据语言检查设置。如果根据语言支持找到有效日期,则返回true,否则返回false。

如果用户A的默认语言为us_english,则日期为4/6/2006将被解释为2006年4月6日。如果用户B的默认语言为“英国”,则日期将被解释为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无法将字符串转换为日期时间值。