Should be really way simpler
SELECT
dob,
[day],
DATEDIFF(yy, 0, [day] - dob) Years,
DATEDIFF(MM, 0, [day] - dob)%12 Months,
DATEDIFF(dd, DATEADD(mm, DATEDIFF(mm, 0, [day] - dob), 0), [day] - dob) days
FROM (
SELECT [day] = CONVERT(datetime, '1992-07-07', 120), dob = CONVERT(datetime, '1927-04-24', 120) UNION ALL -- 65
SELECT [day] = '2000-06-06', dob = '1915-01-31' UNION ALL -- 85
SELECT [day] = '2003-12-15', dob = '1923-06-22' UNION ALL -- 80
SELECT [day] = '2002-03-22', dob = '1917-01-24' UNION ALL -- 85
SELECT [day] = '2008-02-28', dob = '2007-03-01' -- 0
) d
or even more simple:
SELECT
dob,
[day],
YEAR([day] - dob)-1900 Years,
MONTH([day] - dob)-1 Months,
DAY([day] - dob)-1 days
FROM (
SELECT [day] = CONVERT(datetime, '1992-07-07', 120), dob = CONVERT(datetime, '1927-04-24', 120) UNION ALL -- 65
SELECT [day] = '2000-06-06', dob = '1915-01-31' UNION ALL -- 85
SELECT [day] = '2003-12-15', dob = '1923-06-22' UNION ALL -- 80
SELECT [day] = '2002-03-22', dob = '1917-01-24' UNION ALL -- 85
SELECT [day] = '2008-02-28', dob = '2007-03-01' -- 0
) d
([day] - dob) gives you the age in seconds (milliseconds if you wish), and then you simply figure out YEAR, MONTH and DAY of that value.
_____________
Code for TallyGenerator