CREATE FUNCTION dbo.AgeInYears_mvj ( @DOB DATETIME, --Date of birth or date of manufacture @Now DATETIME --Usually, GETDATE() or CURRENT_TIMESTAMP but --can be any date source like a column. )RETURNS TABLE WITH SCHEMABINDING ASRETURNSELECT AgeInYears = CASE WHEN a.[Now] < a.[DOB] THEN null --If birthday hasn't happended yet this year, subtract 1. WHEN DATEADD(yy, DATEDIFF(yy, a.[DOB], a.[Now]), a.[DOB]) > a.[Now] THEN DATEDIFF(yy, a.[DOB], a.[Now]) - 1 ELSE DATEDIFF(yy, a.[DOB], a.[Now]) ENDFROM (SELECT [DOB] = dateadd(dd,datediff(dd,0,@DOB),0), [Now] = dateadd(dd,datediff(dd,0,@Now),0)) a;GO
SELECT * FROM dbo.AgeInYears_MVJ('19601104 01:00','20121104')SELECT * FROM dbo.AgeInYears ('19601104 01:00','20121104')SELECT * FROM dbo.AgeInYears_MVJ('19601104','19601103')SELECT * FROM dbo.AgeInYears ('19601104','19601103')
AgeInYears-----------52AgeInYears-----------51AgeInYears-----------NULLAgeInYears------------1
-- here is a sample table with DOB as DATE only DECLARE @MySample TABLE (DOB DATE) INSERT @MySample VALUES ('5 Nov 2012'),('3 Nov 2014'),('5 Nov 2011'),('6 Nov 2011'),('4 Apr 1973') -- usually it would be single day and most likely it will be today... DECLARE @DateToday DATE = GETDATE() SELECT M.DOB ,AC.AGE FROM @MySample M CROSS APPLY (SELECT DATEDIFF(yy, M.DOB, @DateToday) - CASE WHEN DOB > @DateToday THEN NULL WHEN DATEADD(yy, DATEDIFF(yy, DOB, @DateToday), DOB) > @DateToday THEN 1 ELSE 0 END AGE ) AC
-- here is a sample table with DOB as DATE only DECLARE @MySample TABLE (DOB DATE) INSERT @MySample VALUES ('5 Nov 2012'),('3 Nov 2014'),('5 Nov 2011'),('6 Nov 2011'),('4 Apr 1973') -- Range of dates: DECLARE @Dates TABLE (OnDay DATE) INSERT @Dates VALUES ('5 Nov 2012'),('10 Nov 2020'),('5 Nov 1970'),('5 Nov 2011'),('4 Apr 2073') SELECT M.DOB ,D.OnDay ,AC.AGE FROM @MySample M CROSS JOIN @Dates D CROSS APPLY (SELECT DATEDIFF(yy, M.DOB, D.OnDay) - CASE WHEN DOB > D.OnDay THEN NULL WHEN DATEADD(yy, DATEDIFF(yy, DOB, D.OnDay), DOB) > D.OnDay THEN 1 ELSE 0 END AGE ) AC ORDER BY M.DOB, D.OnDay
declare @dd datetime = '1947-2-24'select datediff(month, @dd, CURRENT_TIMESTAMP)/12
DECLARE @DOB DATETIMESET @DOB = '2008-12-31'DECLARE @Now DATETIMESET @Now = '2009-12-30'select datediff(month, @DOB, @Now)/12