我们现在处于SQL Server和Azure SQL数据库中关于日期和时间的长篇系列的主页。
本周我们将讨论日期和时间中我最喜欢的T-SQL函数之一:DATEADD()
。
句法
与类似的功能一样,DATEADD
可以对日期和时间进行算术运算。语法很简单:
DATEADD (datepart, number, date)
该number
部分必须是整数,并且必须在日期部分的可接受值范围内。
该datepart
部分必须是以下日期部分之一(我们在之前的帖子中看到过):
虽然DATEADD
支持上表中所示的缩写,但我们应尽一切努力使用完整表达式来确保代码的清晰度。如果我们使用缩写,SQL Server不会运行得更快。
另请注意,虽然我们可以使用纳秒加或减DATEADD
,但DATETIME2
数据类型的最小粒度为100纳秒,因此需要考虑舍入。
退货类型
DATEADD
将使用date
参数中使用的数据类型返回结果。例如,如果我们使用以YYYYMMDD
格式表示日期的文字字符串,则返回类型将是一个DATETIME
值,因为文字字符串被隐式转换为DATETIME
。
SELECT DATEADD(DAY,1,'1031')
- 返回DATETIME值'-11-01 00:00:00.000'
但是,如果我们使用DATETIME2
输入值,结果将是一个DATETIME2
值。
SELECT DATEADD(纳秒,100,CAST('1031' AS DATETIME2))
- 返回DATETIME2值'-10-31 00:00:00.0000001'
加减
我们之前看到过DATEADD
可以用于加法和减法,这使得向后和向前计算值变得容易。我们假设我们需要计算100天前的时间点。如果我们以今天为出发点,它将如下所示:
DECLARE @dt DATETIME2 = SYSUTCDATETIME();
SELECT @dt AS [TimeNow],DATEADD(DAY, - 100,@ dt)AS [TimeThen];
注意在部分中使用负号number
。结果如下:
TimeThen: -07-23 09:17:21.7866500TimeNow: -10-31 09:17:21.7866500
几个月的算术
关于这个功能的最后一个想法。在增加或减少月数时,请注意不包含31天的月份。例如,让我们在2月底添加一个月:
SELECT DATEADD(MONTH,1,'0228')
- 返回DATETIME值'0328'
但是,如果我们在1月底添加一个,两个或三个月,我们会看到不同的结果:
SELECT DATEADD(MONTH,1,'0131');
- 返回DATETIME值'0228'
SELECT DATEADD(MONTH,2,'0131');
- 返回DATETIME值'0331'
SELECT DATEADD(MONTH,3,'0131');
- 返回DATETIME值'0430'
DATEADD
是一个非常有用的系统函数在T-SQL中添加和减去日期和时间的值,我广泛使用。只要我们记住它围绕数据类型和数月长度的怪癖,它就会非常强大。