我碰巧偶然发现了这个,找不到任何技术解释:
在 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);
Msg 529, Level 16, State 2, Line 4
Explicit conversion from data type int to date is not allowed.
为什么
CAST
从空字符串到 DATE
和 DATETIME
工作,但来自 0
它只能用作 DATETIME
?我对技术解释感兴趣
最佳答案
我认为这是微软选择支持什么的问题。或多或少归结为允许从数值转换为日期时间的数据,而日期不允许从数值转换。在 SQL Server 中,它必须首先将 0 转换为数字值,如 0.000000000,然后转换为该数字的日期时间等价物。我的示例表明可以将当前日期转换为数值,然后再转换回日期时间。但是,转换为日期会引发错误。如果您尝试将值 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)
Msg 529, Level 16, State 2, Line 5
不允许从数据类型 numeric 到 date 的显式转换。
关于sql - 将 0 转换为 DATE 和 DATETIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643454/