Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
T-SQL中的日期文本_Sql_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

T-SQL中的日期文本

T-SQL中的日期文本,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,今天我不小心忘了在日期文字周围添加引号,如下所示: SELECT DATENAME(dayofyear, '2017-02-05'), -- with quote marks DATENAME(dayofyear, 2017-02-05) -- without quote marks 令人惊讶的是,该查询没有发出TypeError或类似的信号,而是返回了一条带有两列的“success”消息: 701 91 显然,91意味着2017-02-05是2017年的第91天。

今天我不小心忘了在日期文字周围添加引号,如下所示:

SELECT DATENAME(dayofyear, '2017-02-05'),  -- with quote marks 
       DATENAME(dayofyear, 2017-02-05)     -- without quote marks
令人惊讶的是,该查询没有发出
TypeError
或类似的信号,而是返回了一条带有两列的“success”消息:

701 91
显然,
91
意味着2017-02-05是2017年的第91天。但是,
701
没有意义,因为一年最多可以有366天

我的问题是:SQL Server如何解释日期文字?如何处理2017-02-05等无效日期文字?SQL Server可能遵循垃圾输入、垃圾输出的做法,这我可以理解,但我讨厌这样的“无声”错误,因此我想知道幕后发生了什么,以便更容易发现此类错误。

如果运行

SELECT CAST(2017-02-05 AS DATETIME) 
它会回来的
1905-07-04 00:00

似乎发生的是,2010年(2017-2-5的差异)被视为1900-01-01(基准sql日期)之后的天数

因此1900-01-01+2010天=1905年7月4日

然而,当我运行你的查询时,我得到的是
36
185
因为7月4日是1905年的第185天。

如果您运行

SELECT CAST(2017-02-05 AS DATETIME) 
它会回来的
1905-07-04 00:00

似乎发生的是,2010年(2017-2-5的差异)被视为1900-01-01(基准sql日期)之后的天数

因此1900-01-01+2010天=1905年7月4日

然而,当我运行你的查询时,我得到的是
36
185
因为7月4日是1905年的第185天。

当我运行sql server 2012时,结果中的36和185只是一个数学表达式,由一个数字和两个减法组成。当我运行sql server 2012时,结果中的36和185只是一个数学表达式,由一个数字和两个减法组成。