Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2012 SQL Server中的IsDate函数是否将201301视为YYYYMM或YYMMDD? 有人在Microsoft Connect上报告了此错误:_Sql Server 2012_Sql Server 2008_Sql Server - Fatal编程技术网

Sql server 2012 SQL Server中的IsDate函数是否将201301视为YYYYMM或YYMMDD? 有人在Microsoft Connect上报告了此错误:

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:

我在Microsoft Connection网站上看到了以下错误报告。用户报告函数正在验证涉及2012年的期间的格式为
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
    或其他值?还是没关系

  • 我用下面提到的值替换了上面查询中的开始值和结束值。我还列出了在这些范围之间找到的有效行数。为什么以0009结尾的年份不返回任何行

多次尝试: 用于运行上述查询的SQL Server版本: 我在版本上运行了上述查询。我已将此问题标记在下,因为用户在Microsoft Connect网站的该版本下报告了此问题

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,''))