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

标签 sql-server tsql datetime

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

相关文章:

sql - 如何删除复杂 SQL 查询中的某些重复项

sql - 根据角色选择值

sql-server - 从 XML 列中选择属性值时需要/text() 吗?

sql-server - 如何在 transact sql 中执行相当于 "#define SomeValue 5"的操作?

C++ 库 (unix) 解析日期/时间字符串包括时区

sql-server - 不能使用 LONG 数据类型

sql - 为多个组选择每组记录中的最新且特定的版本

sql-server - 数据库的CPU利用率?

PHP 将字符串日期和时间转换为 MySQL DateTime

java - 根据自定义时间单位计算天数