I think division by 365.2425 is not a good way to do this. No unit can completely do this (using 365.25 also has problems).
I know that the following script calculates the exact difference in the date (although it may not be the fastest way):
declare @d1 datetime ,@d2 datetime --set your dates eg: select @d1 = '1901-03-02' select @d2 = '2016-03-01' select DATEDIFF(yy, @d1, @d2) - CASE WHEN MONTH(@d2) < MONTH(@d1) THEN 1 WHEN MONTH(@d2) > MONTH(@d1) THEN 0 WHEN DAY(@d2) < DAY(@d1) THEN 1 ELSE 0 END -- = 114 years
For comparison:
select datediff(day,@d1 ,@d2) / 365.2425
You may be able to calculate small ranges with division, but why take a chance?
The following script can help test the functions of yeardiff (just swap casting (datiff (day, @ d1, @ d2) /365.2425 as int) for any function):
declare @d1 datetime set @d1 = '1900-01-01' while(@d1 < '2016-01-01') begin declare @d2 datetime set @d2 = '2016-04-01' while(@d2 >= '1900-01-01') begin if (@d1 <= @d2 and dateadd(YEAR, cast(datediff(day,@d1,@d2) / 365.2425 as int) , @d1) > @d2) begin select 'not a year!!', @d1, @d2, cast(datediff(day,@d1,@d2) / 365.2425 as int) end set @d2 = dateadd(day,-1,@d2) end set @d1 = dateadd(day,1,@d1) end
Dmitri Rechetilov
source share