我知道解决方法是对两种数据类型使用DATEADD
。我想了解为什么语言设计者选择为一种数据类型而不是另一种数据类型定义此运算符?
当您尝试直接在 DATE
上使用加号运算符时
DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1
您收到此错误消息:
Msg 206, Level 16, State 2, Line 1
Operand type clash: date is incompatible with int
但是,您可以向 DATETIME
添加一个整数,并且可以将该 DATETIME
隐式转换为 DATE
而不会出现错误:
DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1
最佳答案
这是因为出于兼容性目的,SQL Server DATETIME 行为保持不变。自 2008 版本引入 DATETIME2 以来,它禁止添加整数,DATE 也同时引入,这也禁止添加。
最简单的解决方案是将添加移动到 CONVERT 内:
DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE() + 1)
尽管我建议使用 DATEADD 而不是使用整数加法:
DECLARE @tomorrow DATE = CONVERT(DATE, DATEADD(DD, +1, GETDATE()))
关于sql-server - 为什么为 DATETIME 值定义加法运算符而不为 DATE 定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695483/