Penso che la divisione 365.2425 non sia un buon modo per farlo. Nessuna divisione può farlo in modo completamente accurato (l'uso di 365.25 ha anche problemi).
So che il seguente script calcola una precisa differenza di data (anche se potrebbe non essere il modo più veloce):
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
Per fare un confronto:
select datediff(day,@d1 ,@d2)/365.2425
-- = 115 years => wrong!
si potrebbe essere in grado di calcolare i piccoli intervalli con la divisione, ma perché rischiare?
Lo script che segue può aiutare a testare yeardiff funzioni (solo Swap cast (DateDiff (giorno, @ d1, @ d2)/365,2425 come int) per tutto ciò che la funzione è):
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
fonte
2016-04-21 11:09:17
Se avete solo bisogno una cifra significativa, prova DATEDIFF (dd .. e dividi per 365. Questo non influirà sugli anni bisestili, però. –
che lo renderebbe solo come, 1 + -. 1 corretto? –
il suo arrotondamento ancora quando lo faccio in questo modo –