我只是偶然发现了这一点,找不到任何技术上的解释:
在SQL Server 2014中:
SELECT CAST('' AS DATETIME); 1900-01-01 00:00:00.000 SELECT CAST(0 AS DATETIME); 1900-01-01 00:00:00.000 SELECT CAST('' AS DATE); 1900-01-01 SELECT CAST(CAST(0 AS DATETIME) AS DATE); 1900-01-01 SELECT CAST(0 AS DATE);
消息529,级别16,状态2,第4行 不允许从数据类型int到日期的显式转换。
为什么CASTfrom从一个空字符串到DATEandDATETIME起作用,但是from0只能作为as起作用DATETIME?
CAST
DATE
DATETIME
0
我对技术说明感兴趣
我认为这与Microsoft选择支持的问题有关。或多或少地归结为以下事实:允许从数值到日期时间的数据转换,而日期不允许从数值到数据的转换。在SQLServer中,它必须先将0转换为0.000000000之类的数值,然后再转换为该数字的datetime。我的示例表明,可以将当前日期转换为数字值,然后再转换为日期时间。但是,转换为日期会引发错误。我想避免如果您尝试将值0.5转换为日期时可能会出现的舍入问题。在这种情况下,将对SQL引擎进行编程,以将0.5隐式转换为日期1900-01-01或1900-01-02。在这种情况下,您必须对应该返回什么日期做出任意决定。
这有效:
--produces a numeric value like 42746.97660799 select cast(getdate() as numeric(18,8)) select cast(42746.97660799 as datetime)
虽然这会引发您收到的相同错误:
select cast(42746.97660799 as date)
消息529,级别16,状态2,行5不允许从数字类型的数据类型到日期的显式转换。