为什么为DATETIME值定义加法运算符而不为DATE定义?

时间:2015-04-17 09:33:34

标签: sql-server tsql

我知道解决方法是对两种数据类型使用DATEADD。我想理解为什么语言设计者选择为一种数据类型而不是另一种数据类型定义此运算符?

当您尝试直接在DATE

上使用加号运算符时
DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1

您收到以下错误消息:

  

Msg 206,Level 16,State 2,Line 1
  操作数类型冲突:日期与int

不兼容

但是,您可以向DATETIME添加一个整数,并且可以隐式将DATETIME转换为DATE而不会出现错误:

DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1

2 个答案:

答案 0 :(得分:3)

这是因为出于兼容性目的,SQL Server DATETIME行为保持不变。自2008版DATETIME2被引入以来,禁止添加整数的能力,同时也引入了DATE,这也禁止添加。

最简单的解决方案是在CONVERT中移动添加:

DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()+1)

虽然我建议使用DATEADD而不是使用整数加法:

DECLARE @tomorrow DATE = CONVERT(DATE, DATEADD(DD,+1,GETDATE()))

感谢。

答案 1 :(得分:2)

Microsoft SQL Server源自Sybase代码库,其中添加运算符可以将datetime与数字组合在一起并生成数据时间。根据ANSI SQL标准,这种表达式的结果应该产生一个间隔类型(在MSSQL中不存在)。

Microsoft开发的较新的time,date,datetime2,datetimeoffset数据类型故意不支持这种遗留行为,而是支持ANSI标准。必须使用内置的DATEADD函数。