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

vxf3dgd4  于 2023-01-08  发布在  其他
关注(0)|答案(2)|浏览(184)

我知道解决方法是对两种数据类型都使用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
bvuwiixz

bvuwiixz1#

这是因为出于兼容性目的,SQL Server DATETIME行为保持不变。由于引入了版本2008 DATETIME2,该版本禁止添加整数,因此也同时引入了DATE,该版本也禁止添加。
最简单的解决方案是将加法移到CONVERT中:

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

尽管我建议使用DATEADD而不是整数加法:

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

afdcj2ne2#

Microsoft SQL Server起源于Sybase代码库,在Sybase代码库中,加法运算符可以将日期时间与数值组合并生成一个日期时间。根据ANSI SQL标准,此类表达式的结果应生成一个间隔类型(SQL Server中不存在)。
Microsoft开发的较新的time、date、datetime2、datetimeoffset数据类型有意不支持此旧行为,而是支持ANSI标准。必须使用内置的DATEADD函数。

相关问题