如果我们将 DateFormat 设置为 mdy,那么它将对该格式的所有日期验证为真。
如果根据 mdy 发现无效的日期格式,则根据语言检查设置。如果根据语言支持找到有效日期,则返回 true,否则返回 false。
如果用户 A 的默认语言为 us_english,则 2006 年 4 月 6 日的日期将被解释为 2006 年 4 月 6 日。如果用户 B 的默认语言为“英国”,则日期将被解释为 6 月 4 日, 2006 年。
/* 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 无法将该字符串转换为日期时间值。