You'll get bitten if you don't take into account whether the anniversary has occured yet this year! I'd use something like:-- ptp 20040205 Find the number of @pcUnits between two datetime valuesCREATE FUNCTION dbo.fTimeBetween( @pcUnit VARCHAR(10), @pdBegin DATETIME, @pdEnd DATETIME) RETURNS INTAS BEGINDECLARE @iGuess INT, @dTest DATETIMEIF @pcUnit LIKE '%d%' BEGIN SELECT @iGuess = DateDiff(day, @pdBegin, @pdEnd) SELECT @dTest = DateAdd(day, @iGuess, @pdBegin) ENDELSE IF @pcUnit LIKE '%m%' BEGIN SELECT @iGuess = DateDiff(month, @pdBegin, @pdEnd) SELECT @dTest = DateAdd(month, @iGuess, @pdBegin) ENDELSE IF @pcUnit LIKE '%h%' BEGIN SELECT @iGuess = DateDiff(hour, @pdBegin, @pdEnd) SELECT @dTest = DateAdd(hour, @iGuess, @pdBegin) ENDELSE BEGIN SELECT @iGuess = DateDiff(year, @pdBegin, @pdEnd) SELECT @dTest = DateAdd(year, @iGuess, @pdBegin) ENDRETURN CASE WHEN @pdEnd < @dTest THEN @iGuess - 1 ELSE @iGuess ENDENDGOSELECT fTimeBetween('Year', Convert(datetime, Str(y, 4) + '-' + Str(m, 2) + '-' + Str(d, 2), GetDate())-PatP