如何計算兩個日期相差m年n月

如何計算兩個日期相差m年n月,本文利用DATEDIFF函數實作上述需求,以提供可能的解法。

剛在論壇上看到有人提問要計算兩個日期相差m年n月,方法應該很多種,筆者想到的利用DATEDIFF來計算相差m年以及n月,程式碼如下:

 

   1:  declare @d1 datetime = '20110902'
   2:            , @d2 datetime = '20121205'
   3:            , @yeardif int = 0
   4:            , @monthdif int =0
   5:   
   6:  set @yeardif = DATEPART(YEAR,@d2)-DATEPART(YEAR,@d1) 
   7:  set @monthdif =  DATEPART(MONTH,@d2)-DATEPART(MONTH,@d1)
   8:   
   9:  select @d1 as d1,@d2  as d2,@yeardif as y,@monthdif as m
  10:   
  11:  --取得兩個日期相差的年和月
  12:  select (case when @yeardif > 0 and @monthdif < 0 
  13:              then @yeardif -1 else @yeardif end) as '年'
  14:          ,(case when @yeardif >0 and @monthdif < 0 then 12 + @monthdif 
  15:              else @monthdif end) as '月'
  16:   
  17:  --驗證            
  18:  select dateadd(month
  19:                ,(case when @yeardif >0 and @monthdif < 0 then 12 + @monthdif 
  20:                  else @monthdif end)            
  21:                ,(dateadd(year
  22:                          ,(case when @yeardif > 0 and @monthdif < 0 then @yeardif -1     else @yeardif end)
  23:                          ,@d1))
  24:                 )
  25:          

 

 

上述程式碼的第6、7列用來取得兩個日期相差的年(m)和相差的月(n)。接著利用第12-13列來計算,當m大於0而且n小於0時,代表兩個日期相差不滿m年,因此兩個日期相差m-1年,否則兩個日期相差m年。當m大於0且n小於0時,代表兩個第二個日期的月份比第一個日期的月份來的小,因此兩個日期相差12+n月,否則兩個日期相差n月。

所以可以得到下列的結果:

image

image