This demonstrates that the datediff solution does not change the age at the time of the birthdate. All the age results are the same:
declare @BirthDate DATETIME
set @BirthDate = '08/27/1980'
print @BirthDate
print getdate()
SELECT 'DATEDIFF AGE = ', DATEDIFF(YEAR, @birthdate , GETDATE())
print 'TODAY IS THE TWENTY-SIXTH'
set @BirthDate = '08/26/1980'
print @BirthDate
print getdate()
SELECT 'DATEDIFF AGE = ', DATEDIFF(YEAR, @birthdate , GETDATE())
set @BirthDate = '08/25/1980'
print @BirthDate
print getdate()
SELECT 'DATEDIFF AGE = ', DATEDIFF(YEAR, @birthdate , GETDATE())
set @BirthDate = '08/24/1980'
print @BirthDate
print getdate()
SELECT 'DATEDIFF AGE = ', DATEDIFF(YEAR, @birthdate , GETDATE())
The following translates the dates into YYYYMMDD and gets the correct age, changing at at the month and year of the birtdate.
DECLARE
@CURRENT_YEAR INTEGER
, @CURRENT_MONTHS INTEGER
, @CURRENT_DAYS INTEGER
, @CURRENT_YYYYMMDD INTEGER
, @AGE_INTEGER INTEGER
SET @CURRENT_YEAR = DATEPART(YEAR, GETDATE())
SET @CURRENT_MONTHS = DATEPART(MONTH, GETDATE())
SET @CURRENT_DAYS = DATEPART(DAY, GETDATE())
SET @CURRENT_YYYYMMDD = (@CURRENT_YEAR * 10000) + (@CURRENT_MONTHS * 100) + @CURRENT_DAYS
SELECT 'CURRENT_DATE = ' , @CURRENT_YYYYMMDD
declare @BirthDate DATETIME
, @YEARS INTEGER
, @MONTHS INTEGER
, @DAYS INTEGER
, @BIRTH_YYYYMMDD INTEGER
set @BirthDate = '08/27/1980'
set @YEARS = DATEPART(YEAR, @BIRTHDATE)
SET @MONTHS = DATEPART(MM, @BIRTHDATE)
SET @DAYS = DATEPART (DD, @BIRTHDATE)
SET @BIRTH_YYYYMMDD = (@YEARS * 10000) + (@MONTHS * 100) + @DAYS
SET @AGE_INTEGER = (@CURRENT_YYYYMMDD - @BIRTH_YYYYMMDD) / 10000
SELECT 'BIRTH DATE = ' , @BIRTH_YYYYMMDD
SELECT '@AGE_INTEGER = ' , @AGE_INTEGER
PRINT 'TODAY IS THE TWENTY-SIXTH'
set @BirthDate = '08/26/1980'
set @YEARS = DATEPART(YEAR, @BIRTHDATE)
SET @MONTHS = DATEPART(MM, @BIRTHDATE)
SET @DAYS = DATEPART (DD, @BIRTHDATE)
SET @BIRTH_YYYYMMDD = (@YEARS * 10000) + (@MONTHS * 100) + @DAYS
SET @AGE_INTEGER = (@CURRENT_YYYYMMDD - @BIRTH_YYYYMMDD) / 10000
SELECT 'BIRTH DATE = ' , @BIRTH_YYYYMMDD
SELECT '@AGE_INTEGER = ' , @AGE_INTEGER
set @BirthDate = '08/25/1980'
set @YEARS = DATEPART(YEAR, @BIRTHDATE)
SET @MONTHS = DATEPART(MM, @BIRTHDATE)
SET @DAYS = DATEPART (DD, @BIRTHDATE)
SET @BIRTH_YYYYMMDD = (@YEARS * 10000) + (@MONTHS * 100) + @DAYS
SET @AGE_INTEGER = (@CURRENT_YYYYMMDD - @BIRTH_YYYYMMDD) / 10000
SELECT 'BIRTH DATE = ' , @BIRTH_YYYYMMDD
SELECT '@AGE_INTEGER = ' , @AGE_INTEGER
set @BirthDate = '08/24/1980'
set @YEARS = DATEPART(YEAR, @BIRTHDATE)
SET @MONTHS = DATEPART(MM, @BIRTHDATE)
SET @DAYS = DATEPART (DD, @BIRTHDATE)
SET @BIRTH_YYYYMMDD = (@YEARS * 10000) + (@MONTHS * 100) + @DAYS
SET @AGE_INTEGER = (@CURRENT_YYYYMMDD - @BIRTH_YYYYMMDD) / 10000
SELECT 'BIRTH DATE = ' , @BIRTH_YYYYMMDD
SELECT '@AGE_INTEGER = ' , @AGE_INTEGER