我知道解决方法是对两种数据类型都使用DATEADD
,我想了解为什么语言设计者选择为一种数据类型定义这个操作符,而不是为另一种数据类型定义这个操作符?
尝试直接在DATE
上使用加号运算符时
DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1
您将看到以下错误消息:
消息206,级别16,状态2,行1
操作数类型冲突:日期与int不兼容
但是,您可以将一个整数添加到DATETIME
中,并且可以将该DATETIME
隐式转换为DATE
,而不会出现错误:
DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1
2条答案
按热度按时间bvuwiixz1#
这是因为出于兼容性目的,SQL Server DATETIME行为保持不变。由于引入了版本2008 DATETIME2,该版本禁止添加整数,因此也同时引入了DATE,该版本也禁止添加。
最简单的解决方案是将加法移到CONVERT中:
尽管我建议使用DATEADD而不是整数加法:
afdcj2ne2#
Microsoft SQL Server起源于Sybase代码库,在Sybase代码库中,加法运算符可以将日期时间与数值组合并生成一个日期时间。根据ANSI SQL标准,此类表达式的结果应生成一个间隔类型(SQL Server中不存在)。
Microsoft开发的较新的time、date、datetime2、datetimeoffset数据类型有意不支持此旧行为,而是支持ANSI标准。必须使用内置的DATEADD函数。