問題描述:我們在寫存儲過程和函數的時候經常會碰到利用當前日期計算出上周開始日期、結束日期,或者計算上個月的開始日期結束日期等問題。最近寫了幾個存儲過程和函數,其中都涉及到了日期計算問題,在這里簡單做一個總結,留待以后查閱。
涉及知識分享:SQL中的日期計算主要涉及到GETDATE()、DATEDIFF()和DATEADD()三個方法,利用這三個方法的巧妙組合就可以得到我們想要的日期結果。首先,簡單介紹一下這三個方法的定義:
(1)GETDATE():
定義:從 SQL Server 返回當前的時間和日期;
語法:GETDATE(),沒有參數;
示例:select GETDATE();
結果:2016-04-26 13:35:14.670
(2)DATEDIFF()
定義:返回兩個日期之間的天數;
語法:DATEDIFF(datepart,startdate,enddate), startdate 和 enddate 參數是合法的日期表達式。datepart 參數可以是下列的值:

示例:select DATEDIFF(dd,'2016-4-21','2016-4-26');
結果:5
(3)DATEADD():
定義:在日期中添加或減去指定的時間間隔;
語法:DATEADD(datepart,number,date), date 參數是合法的日期表達式。number 是您希望添加的間隔數;對於未來的時間,此數是正數,對於過去的時間,此數是負數。datepart 參數與DATEDIFF的datepart 參數一致,參見上表。
示例:select DATEADD(dd,5,'2016-4-21');
結果:2016-04-26 00:00:00.000
具體日期計算示例:
(1)得到當前日期:
SQL: select GETDATE();
結果:2016-04-26 13:47:06.903
(2)得到本周周一日期:
SQL: select DATEADD(week,DATEDIFF(week,0,GETDATE()),0)
結果:2016-04-25 00:00:00.000
(3)得到上周周一日期(在本周周一的基礎上剪掉一周即可):
SQL: select DATEADD(week,-1,DATEADD(week,DATEDIFF(week,0,GETDATE()),0))
結果:2016-04-18 00:00:00.000
(4)得到上周周日日期,舉其中兩種思維方法:
第一種:先得到本周周日的日期,然后減一周
SQL: select dateadd(week,-1,DATEADD(week,DATEDIFF(week,0,getdate()),6))
結果:2016-04-24 00:00:00.000
第二種:用本周周一的日期減掉1秒
SQL: select DATEADD(ss,-1,DATEADD(week,DATEDIFF(week,0,GETDATE()),0))
結果:2016-04-24 23:59:59.000
(5)得到本月第一天日期:
SQL: select DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0)
結果:2016-04-01 00:00:00.000
(6)得到上個月第一天日期(即在本月第一天日期取月的間隔數時減一即可):
SQL: select DATEADD(MM,DATEDIFF(MM,0,GETDATE())-1,0)
結果:2016-03-01 00:00:00.000
(7)得到上個月最后一天日期(即在本月第一天的基礎上減掉一秒即可):
SQL: select DATEADD(SS,-1,DATEADD(MM,DATEDIFF(MM,0,GETDATE()),0))
結果:2016-03-31 23:59:59.000
關於計算兩個日期間隔數DATEDIFF函數的參數0對應的日期時間問題:
在使用DATEDIFF計算日期時經常會用到參數0,參數0對應的日期是默認的日期1900-00-00 00:00:00.000,具體得到的計算間隔數由datepart參數決定。例如:
SQL:select DATEDIFF(yy,0,GETDATE()) as countYear,DATEDIFF(mm,0,GETDATE()) as countMonth,DATEDIFF(dd,0,GETDATE()) as countDay,DATEDIFF(week,0,GETDATE()) as countWeek,DATEDIFF(hh,0,GETDATE()) as countHour
結果:
| countYear | countMonth | countDay | countWeek | countHour | |
| 1 | 116 | 1395 | 42485 | 6069 | 1019649 |
