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