Solved

# T-SQL: calculating person age

Posted on 2013-11-01
Medium Priority
1,516 Views
One table column has Date of Birth.
I have to calculate person's age in  years, for example 1.23 ,  8.35 , 37.36 etc. in another column.
Any thoughts on this?
0
Question by:quasar_ee
[X]
###### Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

• Help others & share knowledge
• Earn cash & points
• 2

LVL 11

Accepted Solution

Simone B earned 1000 total points
ID: 39617946
DATEDIFF returns an integer, so you have to cast or convert to a decimal. If you use 365.25 days per year instead of 365, that will cover for the leap years. Then to round the whole thing to 2 decimal places, cast again:

SELECT CAST(CAST(DATEDIFF(d,YourDateField,GETDATE()) AS DECIMAL(10,2))/365.00 AS DECIMAL(10,2))
0

LVL 93

Expert Comment

ID: 39619158
Buttercup1,

I like it, but I see a couple of problems, such as:
In either formula, having two decimal places is not enough precision, and
In the 365.25 formula, you have a risk that you will understate the true age in some edge cases

Illustrating the first, consider this example:

``````DECLARE @dob datetime = '2012-02-28',
@today datetime = '2013-02-27'

SELECT CAST(CAST(DATEDIFF(d, @dob, @today) AS DECIMAL(10, 2)) / 365.00 AS DECIMAL(10, 2)) AS _365,
CAST(CAST(DATEDIFF(d, @dob, @today) AS DECIMAL(10, 2)) / 365.25 AS DECIMAL(10, 2)) AS _36525
``````

This returns 1.00 and 1.00, respectively, yet most people would agree that this person is not yet a year old.  Using only two digits for the decimal portion is not precise enough.  Using decimal(10, 4) instead would remedy that.

Now consider how using 365.25 can understate the age in some edge cases.  (I am adopting the more precise decimal(10, 4) here.)

``````DECLARE @dob datetime = '2013-02-28',
@today datetime = '2014-02-28'

SELECT CAST(CAST(DATEDIFF(d, @dob, @today) AS DECIMAL(10, 4)) / 365.00 AS DECIMAL(10, 4)) AS _365,
CAST(CAST(DATEDIFF(d, @dob, @today) AS DECIMAL(10, 4)) / 365.25 AS DECIMAL(10, 4)) AS _36525
``````

The "365" formula returns 1.0000, and the "365.25" formula returns 0.9993, but everyone would agree that such a person should be counted as one year old.

:)

Patrick
0

LVL 93

Assisted Solution

Patrick Matthews earned 1000 total points
ID: 39619233
Inelegant, and there may well be a better way, but this does address the points I made above:

``````SELECT
DOB, GETDATE(),
DATEADD(year, DATEDIFF(year, DOB, GETDATE()) - 1, DOB),
CASE
WHEN CONVERT(date, DATEADD(year, DATEDIFF(year, DOB, GETDATE()), DOB)) > CONVERT(date, GETDATE()) THEN
CONVERT(decimal(10, 4), DATEDIFF(year, DOB, GETDATE()) - 1) +
CONVERT(decimal(10, 4), DATEDIFF(day, DATEADD(year, DATEDIFF(year, DOB, GETDATE()) - 1, DOB), GETDATE())) /
CONVERT(decimal(10, 4), DATEDIFF(day, DATEADD(year, DATEDIFF(year, DOB, GETDATE()) - 1, DOB), DATEADD(year, DATEDIFF(year, DOB, GETDATE()), DOB)))
WHEN CONVERT(date, DATEADD(year, DATEDIFF(year, DOB, GETDATE()), DOB)) < CONVERT(date, GETDATE()) THEN
CONVERT(decimal(10, 4), DATEDIFF(year, DOB, GETDATE())) +
CONVERT(decimal(10, 4), DATEDIFF(day, DATEADD(year, DATEDIFF(year, DOB, GETDATE()), DOB), GETDATE())) /
CONVERT(decimal(10, 4), DATEDIFF(day, DATEADD(year, DATEDIFF(year, DOB, GETDATE()), DOB), DATEADD(year, DATEDIFF(year, DOB, GETDATE()) + 1, DOB)))
ELSE
CONVERT(decimal(10, 4), DATEDIFF(year, DOB, GETDATE()))
END AS Age
FROM SomeTable
``````
0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Why is this different from all of the other step by step guides?  Because I make a living as a DBA and not as a writer and I lived through this experience. Defining the name: When I talk to people they say different names on this subject stuff l…
International Data Corporation (IDC) prognosticates that before the current the year gets over disbursing on IT framework products to be sent in cloud environs will be \$37.1B.
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.
Viewers will learn how to use the SELECT statement in SQL and will be exposed to the many uses the SELECT statement has.
###### Suggested Courses
Course of the Month10 days, 12 hours left to enroll