Sql server 为什么可以从日期时间中减去整数,但不能从日期类型中减去整数

Sql server 为什么可以从日期时间中减去整数,但不能从日期类型中减去整数,sql-server,sql-server-2012,Sql Server,Sql Server 2012,DATETIME和INTEGER与DATE和INTEGER之间的关系是否一致 这很好: DECLARE @Yesterday DATETIME = GETDATE(); SELECT @Yesterday-1; 正如这一点: DECLARE @Yesterday DATE = GETDATE(); SELECT @Yesterday; 此错误: DECLARE @Yesterday DATE = GETDATE(); SELECT @Yesterday-1; 我可以安全地从日期时间中减去整

DATETIME和INTEGER与DATE和INTEGER之间的关系是否一致

这很好:

DECLARE @Yesterday DATETIME = GETDATE();
SELECT @Yesterday-1;
正如这一点:

DECLARE @Yesterday DATE = GETDATE();
SELECT @Yesterday;
此错误:

DECLARE @Yesterday DATE = GETDATE();
SELECT @Yesterday-1;
我可以安全地从
日期时间
中减去
整数
类型,但不能从
日期
中减去

这种行为的原因是什么?

事实上,这是非常一致的
DATETIME
是从以前版本的sql server继承的类型。自2008年版以来,引入了DATETIME2,并消除了添加/减去整数的可能性。您仍然可以在
DATETIME
上作为一种传统方式进行此操作

DATE
,比如
DATETIME2
也是从2008年开始出现的,对于这种类型,数字的加减也是被禁止的

这会给您一个错误:

DECLARE @Yesterday DATETIME2 = GETDATE();
SELECT @Yesterday-1;

所以一切都很好:)。

所以这可能更好:

declare @Yesterday DATE = DATEADD(d, -1, getdate())
select @Yesterday

int
datetime
的隐式转换可以追溯到Sybase天。我猜对于新的数据类型,他们决定不这样做,这可能是导致错误的原因(意外地将整数值插入
datetime
列中,并且没有被提醒该问题)。一个相关的连接项请求抱怨隐式转换@MartinSmith upped-感谢info@MartinSmith-你投票决定结束吗?不管是谁做的,都没有留下任何评论;很高兴看到评论,因为它提供了修改OPNo的可能性,我还没有投票结束。两者都是离题投票。一个用于迁移到另一个直接的主题。我考虑的是“不具建设性”,因为只有微软能告诉你设计决定的最终原因。@MartinSmith-我现在已经编辑了对MS的明确引用-谢谢你的信息-有很多解决办法-我只是想知道“为什么?”