Jam*_*mie 5 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.
Run Code Online (Sandbox Code Playgroud)
最后一个示例返回1(有效日期),但上面的日期格式与函数表达式中的格式不匹配.我认为这是文档中的一个错误,但后来好奇地尝试了它,它确实返回1.
那么为什么'2008/04/15'是日期格式为mdy的有效日期?
这里的文档:http://msdn.microsoft.com/en-us/library/ms187347(SQL.105).aspx
来自http://msdn.microsoft.com/en-us/library/ms187347%28SQL.105%29.aspx#SessionSettingDependencies
ISDATE的返回值取决于SET DATEFORMAT,SET LANGUAGE和默认语言选项设置的设置.
因此,如果给定的字符串不适用于set dateformat,它也会删除默认语言选项,该选项允许日期格式为y/m/d
如果我们将 DateFormat 设置为 mdy,那么它将验证此格式的所有日期为真。
如果根据 mdy 发现无效的日期格式,则它会根据语言检查设置。如果找到语言支持的有效日期,则返回 true 否则返回 false。
如果用户 A 的默认语言为 us_english,则 4/6/2006 的日期将被解释为 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;
Run Code Online (Sandbox Code Playgroud)
数字格式可以使用短划线 (-)、点 (.) 或斜线 (/) 作为分隔符。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.
Run Code Online (Sandbox Code Playgroud)
请仔细阅读错误消息。它准确地说明了问题所在。您将日期时间值指定为字符串,并且因为该字符串不是根据您使用的格式和 DATEFORMAT 设置形成的,所以 SQL Server 无法将该字符串转换为日期时间值。