1. 程式人生 > >SQL Server中的日期和時間:DATEADD()

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中新增和減去日期和時間的值,我廣泛使用。只要我們記住它圍繞資料型別和數月長度的怪癖,它就會非常強大。