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

Ant*_*ull 6 t-sql sql-server datetime

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

当你尝试直接使用加号运算符 DATE

DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE()) + 1
Run Code Online (Sandbox Code Playgroud)

你收到此错误信息:

消息206,级别16,状态2,行1
操作数类型冲突:日期与int不兼容

但是,您可以向a添加一个整数DATETIME,并且可以隐式地将其转换DATETIMEDATE没有错误的整数:

DECLARE @thisTimeTomorrow DATETIME = GETDATE() + 1
DECLARE @tomorrow DATE = GETDATE() + 1
Run Code Online (Sandbox Code Playgroud)

Joh*_*ell 4

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

最简单的解决方案是将加法移到 CONVERT 内:

DECLARE @tomorrow DATE = CONVERT(DATE, GETDATE() + 1)
Run Code Online (Sandbox Code Playgroud)

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

DECLARE @tomorrow DATE = CONVERT(DATE, DATEADD(DD, +1, GETDATE()))
Run Code Online (Sandbox Code Playgroud)

  • 经过对这个问题的一些研究后,我编辑了我的答案。看来 DATETIME 对于所有密集目的都已“废弃”,但保留是为了解决遗留代码问题。DATETIME2 是自 2008 年以来 SQL Server 中的官方日期时间对象,应该使用,但说实话我自己从未使用过它。感谢您的意见。 (2认同)