小编典典

将0转换为DATE和DATETIME

sql

我只是偶然发现了这一点,找不到任何技术上的解释:

在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

我对技术说明感兴趣


阅读 359

收藏
2021-04-07

共1个答案

小编典典

我认为这与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不允许从数字类型的数据类型到日期的显式转换。

2021-04-07