nal*_*zok 0 sql t-sql sql-server sql-server-2008
今天我偶然忘记在日期文字周围添加引号,如下所示:
SELECT DATENAME(dayofyear, '2017-02-05'), -- with quote marks
DATENAME(dayofyear, 2017-02-05) -- without quote marks
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,TypeError此查询不是发出类似信号或类似信号,而是返回包含两列的"成功"消息:
701 91
Run Code Online (Sandbox Code Playgroud)
很明显,这91意味着2017-02-05是2017年的第91天.但是,701没有意义,一年最多可以有366天.
我的问题是:SQL Server如何解释日期文字?以及如何2017-02-05处理无效的日期文字?SQL Server可能遵循垃圾进入,行李搬运的做法,我可以理解,但我讨厌像这样的"漏洞"错误,所以我想知道幕后发生了什么,以便发现这样的错误可能更容易.
如果你跑
SELECT CAST(2017-02-05 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
它会回来
1905-07-04 00:00
似乎发生的是2010年(2017-2-5的差异)被视为1900-01-01之后的天数(基本sql日期)
所以1900-01-01 + 2010天= 1965年4月4日
然而,当我运行你的查询时,我得到的是
36,185因为jul 4是1905年的第185天.