[英]Date literals in T-SQL
今天,我不小心忘记在日期文字周围添加引号,如下所示:
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遵循的是垃圾进出,讨价还价的做法,但是我讨厌这样的“倾斜”错误,所以我想知道幕后发生的事情,这样发现这些错误可能会更容易。
如果你跑
SELECT CAST(2017-02-05 AS DATETIME)
它将返回1905-07-04 00:00
似乎发生的事情是将2010年(与2017年2月5日的差异)视为1900年1月1日(基本sql日期)之后的天数
所以1900-01-01 + 2010天= 1905年7月4日
但是,当我运行您的查询时,我得到的分别是36
和185
因为7月4日是1905年的第185天。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.