5

因此,我查看了 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。

那么,当日期格式为 mdy 时,为什么 '2008/04/15' 是有效日期?

此处的文档:http: //msdn.microsoft.com/en-us/library/ms187347 (SQL.105).aspx

4

2 回答 2

7

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

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

因此,如果给定的字符串不适用于设置的日期格式,它还会检查默认语言选项,该选项允许日期格式为 y/m/d

于 2012-04-26T10:50:16.950 回答
5

如果我们将 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 无法将该字符串转换为日期时间值。

于 2012-04-26T11:16:22.690 回答