sql - 将 0 转换为 DATE 和 DATETIME

标签 sql sql-server casting sql-server-2014

我碰巧偶然发现了这个,找不到任何技术解释:

在 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从空字符串到 DATEDATETIME工作,但来自 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/

相关文章:

sql-server - 使用 if 语句构建动态 cfquery - ColdFusion

c++ - 编译时间测试两个类之间的 void* 类型转换安全性

C 运算符结果类型

mysql - NodeJS Express 内连接问题

sql - 从 column_name = all_values 的表中选择 column_name

mysql - 仅在一个表中、仅在第二个表中以及在两个表中的条目的百分比

casting - 声明了一个列表,实现为 LinkedList,不能使用 getLast() 方法

sql - 用于选择首选糖果的高效 SQL 2000 查询

c# - 在 DbMigration 中访问 Up 里面的上下文

sql - 参数化 SQL 查询中变量的影响