On stackoverflow I found the following query to calculate a person’s age in years from their date of birth:
DECLARE @date_of_birth date = '2003-01-21';
DECLARE @todays_date date = '2014-03-01';
SELECT
(CONVERT(INT,CONVERT(VARCHAR(8),@todays_date,112)) - CONVERT(INT,CONVERT(VARCHAR(8),@date_of_birth,112)))/10000;
Breaking down this query, we can see how it works:
DECLARE @date_of_birth date = '2003-01-21';
DECLARE @todays_date date = '2014-03-01';
SELECT
@date_of_birth
, @todays_date
, CONVERT(INT,CONVERT(VARCHAR(8),@date_of_birth,112))
, CONVERT(INT,CONVERT(VARCHAR(8),@todays_date,112))
, CONVERT(INT,CONVERT(VARCHAR(8),@todays_date,112)) - CONVERT(INT,CONVERT(VARCHAR(8),@date_of_birth,112))
, (CONVERT(INT,CONVERT(VARCHAR(8),@todays_date,112)) - CONVERT(INT,CONVERT(VARCHAR(8),@date_of_birth,112)))/10000;
which returns:
2003-01-21
|
2014-03-01
|
20030121
|
20140301
|
110180
|
11
|
For those born on a Leap day, this query assumes their birthday is on the 1st March in non-Leap years:
DECLARE @dates_table TABLE (
Date_of_Birth DATE NOT NULL
,Todays_Date DATE NOT NULL);
INSERT INTO @dates_table
VALUES ('2000-03-01','2013-03-01'),('2000-03-01','2013-11-07')
,('2000-12-01','2013-11-07'),('2000-11-06','2013-11-07')
,('2000-11-08','2013-11-07'),('2004-02-29','2012-01-28')
,('2004-02-29','2012-02-28'),('2004-02-29','2012-02-29')
,('2004-02-29','2012-03-01'),('2004-02-29','2013-02-28')
,('2004-02-29','2013-03-01'),('2004-02-29','2014-02-28')
,('2004-02-29','2014-03-01');
SELECT
Date_of_Birth
, Todays_Date
, CONVERT(INT,CONVERT(VARCHAR(8),Date_of_Birth,112))
, CONVERT(INT,CONVERT(VARCHAR(8),Todays_Date,112))
, CONVERT(INT,CONVERT(VARCHAR(8),Todays_Date,112)) - CONVERT(INT,CONVERT(VARCHAR(8),Date_of_Birth,112))
, (CONVERT(INT,CONVERT(VARCHAR(8),Todays_Date,112)) - CONVERT(INT,CONVERT(VARCHAR(8),Date_of_Birth,112)))/10000
FROM
@dates_table;
which returns:
2000-03-01 |
2013-03-01 |
20000301 |
20130301 |
130000 |
13 |
2000-03-01 |
2013-11-07 |
20000301 |
20131107 |
130806 |
13 |
2000-12-01 |
2013-11-07 |
20001201 |
20131107 |
129906 |
12 |
2000-11-06 |
2013-11-07 |
20001106 |
20131107 |
130001 |
13 |
2000-11-08 |
2013-11-07 |
20001108 |
20131107 |
129999 |
12 |
2004-02-29 |
2012-01-28 |
20040229 |
20120128 |
79899 |
7 |
2004-02-29 |
2012-02-28 |
20040229 |
20120228 |
79999 |
7 |
2004-02-29 |
2012-02-29 |
20040229 |
20120229 |
80000 |
8 |
2004-02-29 |
2012-03-01 |
20040229 |
20120301 |
80072 |
8 |
2004-02-29 |
2013-02-28 |
20040229 |
20130228 |
89999 |
8 |
2004-02-29 |
2013-03-01 |
20040229 |
20130301 |
90072 |
9 |
2004-02-29 |
2014-02-28 |
20040229 |
20140228 |
99999 |
9 |
2004-02-29 |
2014-03-01 |
20040229 |
20140301 |
100072 |
10 |