此代码如何在不使用 DATEADD 的情况下向日期时间添加数字?

tom*_*dox 0 sql t-sql sql-server

在下面的 SQL 语句中,有一些 T-SQL 将数字添加到 adatetime和 a 中date

declare @t table(UserID int, StartDate datetime, EndDate date)
insert @t select 1, '20110101', '20110102' 

-- Adding int to a datetime works
select t.StartDate + 2 as NewStartDate

-- Adding int to a date errors
select t.EndDate + 2 as NewEndDate
Run Code Online (Sandbox Code Playgroud)

我预计上述两个 select 语句都会失败,因为它们都没有使用该DATEADD方法,但令我惊讶的是,在不使用 using的情况下将 an 添加int到 a 中是有效的。这是为什么?datetimeDATEADD

Gor*_*off 5

您可以将数字添加到datetime. 它被解释为天数。

也许令人惊讶的是,SQL Server 不支持将整数添加到date.

所以,这有效:

select getdate() + 1
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:

select cast(getdate() as date) + 1
Run Code Online (Sandbox Code Playgroud)

这在+ (运算符)的文档中进行了解释:

表达

是数字类别中除位数据类型之外的任何一种数据类型的任何有效表达式。不能与datetimedatetime2、 或datetimeoffset数据类型一起使用。

我的意思是,任何阅读本文的人都会立即注意到它datetime属于“数字”类别,并且在不支持的类型列表中缺失。

我应该注意到,此功能还允许添加两个datetime值。这对于将“时间”(转换为datetime)添加到日期(转换为datetime)非常方便。