Sql server 2012 SQL Server中的IsDate函数是否将201301视为YYYYMM或YYMMDD? 有人在Microsoft Connect上报告了此错误:
我在Microsoft Connection网站上看到了以下错误报告。用户报告函数正在验证涉及2012年的期间的格式为Sql server 2012 SQL Server中的IsDate函数是否将201301视为YYYYMM或YYMMDD? 有人在Microsoft Connect上报告了此错误:,sql-server-2012,sql-server-2008,sql-server,Sql Server 2012,Sql Server 2008,Sql Server,我在Microsoft Connection网站上看到了以下错误报告。用户报告函数正在验证涉及2012年的期间的格式为YYYYMM,但自2013年初起停止工作 用户已报告以下内容作为输入数据。我已经列出了用户期望的内容以及SQLServer的输出 SELECT ISDATE(201201) AS CheckDate1 --Expected: 1; Actual: 1 , ISDATE(201301) AS CheckDate2 --Expected:
YYYYMM
,但自2013年初起停止工作
用户已报告以下内容作为输入数据。我已经列出了用户期望的内容以及SQLServer的输出
SELECT ISDATE(201201) AS CheckDate1 --Expected: 1; Actual: 1
, ISDATE(201301) AS CheckDate2 --Expected: 1; Actual: 0
, ISDATE(201401) AS CheckDate3 --Expected: 1; Actual: 0
, ISDATE(20130101) AS CheckDate4 --Expected: 1; Actual: 1
阅读MSDN文档:
我阅读了MSDN网站上关于的文档。文档说明了以下定义,但未找到任何示例来验证函数是否正在验证yyyym
Returns 1 if the expression is a valid date, time, or datetime value;
otherwise, 0.
关于数据类型的定义,我找不到任何东西表明YYYYMM
是有效的日期格式。用户指定的值也不是格式
我写了下面的脚本来了解发生了什么
查询试图找出发生了什么:
问题:
- IsDate将上述值视为
而不是YYMMDD
是否正确YYYYMM
- 如果函数试图评估的格式确实是YYMMDD,那么它代表哪个世纪。它是否代表年份
或1920
或其他值?还是没关系2020
- 我用下面提到的值替换了上面查询中的开始值和结束值。我还列出了在这些范围之间找到的有效行数。为什么以00到09结尾的年份不返回任何行
Microsoft SQL Server 2012-11.0.2316.0(X64)
2012年4月6日03:20:55
版权所有(c)微软公司
Windows NT 6.1上的企业版(64位)
(构建7601:Service Pack 1)(虚拟机监控程序)
isdate所做的只是检查字符串是否可以转换为日期
幸运的是,12个月是有效月份
以此为例
SELECT ISDATE('201201'),ISDATE('201301'),ISDATE('199901')
如您所见,1999也返回0
当然,你也可以从这样的事情中得到乐趣
SELECT ISDATE(CONVERT(DATETIME,0)),ISDATE(CONVERT(DATETIME,''))
根据您的结果,似乎eg
201201
或201301
被解释为YYMMDD
。(第13个月的日期则视为无效。)
yymmdd
2049
,因此以<50
*结尾的年份为20xx
,而=50
的年份为19xx
isdate
时,它隐式转换为一个字符串,不带前导零isdate不仅仅看月份和年份,它还看日期,基本上它检查你传递的信息是否可以转换成日期,这些人只是幸运他们在1999年没有运行这个
Start End Rows
------ ------ ----
000000 001231 0
010000 011231 0
020000 021231 0
030000 031231 0
040000 041231 0
050000 051231 0
060000 061231 0
070000 071231 0
080000 081231 0
090000 091231 0
100000 101231 365
110000 111231 365
120000 121231 366
...
...
980000 981231 365
990000 991231 365
Microsoft SQL Server 2012 - 11.0.2316.0 (X64)
Apr 6 2012 03:20:55
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64>
(Build 7601: Service Pack 1) (Hypervisor)
SELECT ISDATE('201201'),ISDATE('201301'),ISDATE('199901')
SELECT ISDATE(CONVERT(DATETIME,0)),ISDATE(CONVERT(DATETIME,''))