SQL Server中的日期和時間:DATEADD()
我們現在處於SQL Server和Azure SQL資料庫中關於日期和時間的長篇系列的主頁。
本週我們將討論日期和時間中我最喜歡的T-SQL函式之一: DATEADD()
。
句法
與類似的功能一樣, DATEADD
可以對日期和時間進行算術運算。語法很簡單:
DATEADD (datepart, number, date)
該 number
部分必須是整數,並且必須在日期部分的可接受值範圍內。
該 datepart
部分必須是以下日期部分之一(我們在之前的
DATEPART | 縮略語 |
年 | 是的,yyyy |
25美分硬幣 | qq,q |
月 | mm,m |
DAYOFYEAR | dy,y |
天 | dd,d |
周 | wk,××× |
平日 | dw,w |
小時 | HH |
分鐘 | mi,n |
第二 | ss,s |
毫秒 | 女士 |
微秒 | MCS |
納秒 | NS |
雖然 DATEADD
支援上表中所示的縮寫,但我們應盡一切努力使用完整表示式來確保程式碼的清晰度。如果我們使用縮寫,SQL Server不會執行得更快。
另請注意,雖然我們可以使用納秒加或減 DATEADD
,但DATETIME2
資料型別的最小粒度為 100納秒,因此需要考慮舍入。
退貨型別
DATEADD
將使用date
引數中使用的資料型別返回結果 YYYYMMDD
格式表示日期的文字字串 ,則返回型別將是一個 DATETIME
值,因為文字字串被隱式轉換為 DATETIME
。
SELECT DATEADD(DAY,1,'20181031')
- 返回DATETIME值'2018-11-01 00:00:00.000'
但是,如果我們使用 DATETIME2
輸入值,結果將是一個 DATETIME2
值。
SELECT DATEADD(納秒,100,CAST('20181031' AS DATETIME2))
- 返回DATETIME2值'2018-10-31 00:00:00.0000001'
加減
我們之前看到過 DATEADD
可以用於加法 和 減法,這使得向後和向前計算值變得容易。我們假設我們需要計算100天前的時間點。如果我們以今天為出發點,它將如下所示:
DECLARE @dt DATETIME2 = SYSUTCDATETIME();
SELECT @dt AS [TimeNow],DATEADD(DAY, - 100,@ dt)AS [TimeThen];
注意在部分中使用負號 number
。結果如下:
TimeNow: 2018-10-31 09:17:21.7866500
TimeThen: 2018-07-23 09:17:21.7866500
幾個月的算術
關於這個功能的最後一個想法。在增加或減少月數時,請注意不包含31天的月份。例如,讓我們在2018年2月底新增一個月:
SELECT DATEADD(MONTH,1,'20180228')
- 返回DATETIME值'20180328'
但是,如果我們在2018年1月底新增一個,兩個或三個月,我們會看到不同的結果:
SELECT DATEADD(MONTH,1,'20180131');
- 返回DATETIME值'20180228'
SELECT DATEADD(MONTH,2,'20180131');
- 返回DATETIME值'20180331'
SELECT DATEADD(MONTH,3,'20180131');
- 返回DATETIME值'20180430'
DATEADD
是一個非常有用的系統函式在T-SQL中新增和減去日期和時間的值,我廣泛使用。只要我們記住它圍繞資料型別和數月長度的怪癖,它就會非常強大。