在SQL中找到某人的年龄

时间:2008-11-12 12:15:37

标签: sql sql-server tsql

在SQL Server数据库中,我记录人们的出生日期。是否有一种直接的方法只使用SQL来计算给定日期的人的年龄?

使用 DATEDIFF(YEAR,DateOfBirth,GETDATE())不起作用,因为这只会查看日期的年份部分。例如 DATEDIFF(年份,'2007年12月31日','2008年1月1日')返回1.

7 个答案:

答案 0 :(得分:21)

查看此文章:How to calculate age of a person using SQL codes

以下是文章中的代码:

DECLARE @BirthDate DATETIME
DECLARE @CurrentDate DATETIME

SELECT @CurrentDate = '20070210', @BirthDate = '19790519'

SELECT DATEDIFF(YY, @BirthDate, @CurrentDate) - CASE WHEN( (MONTH(@BirthDate)*100 + DAY(@BirthDate)) > (MONTH(@CurrentDate)*100 + DAY(@CurrentDate)) ) THEN 1 ELSE 0 END 

答案 1 :(得分:5)

还有另一种方法更简单:

Select CAST(DATEDIFF(hh, [birthdate], GETDATE()) / 8766 AS int) AS Age

因为这里的舍入是非常精细的,所以几乎完全准确。例外是如此令人费解,以至于它们几乎是幽默的:如果我们A)要求在上午6:00之前的年龄,B)在这个人的生日和C)他们的生日是在之后,每四年回来的年龄将是一年太年轻2月28日。在我的环境中,这是一个完全可以接受的妥协。

答案 2 :(得分:2)

FWIW,年龄可以直接计算而不诉诸黑客(并不是说黑客有什么问题!):

CREATE FUNCTION Age (@BirthDate DATETIME)
RETURNS INT
AS
BEGIN
    DECLARE @AgeOnBirthdayThisYear INT
    DECLARE @BirthdayThisYear DATETIME
    SET @AgeOnBirthdayThisYear = DATEDIFF(year, @BirthDate, GETDATE())
    SET @BirthdayThisYear = DATEADD(year, @AgeOnBirthdayThisYear, @BirthDate)
    RETURN
        @AgeOnBirthdayThisYear
        - CASE WHEN @BirthdayThisYear > GETDATE() THEN 1 ELSE 0 END
END

答案 3 :(得分:1)

此解决方案显示了如何在一个没有变量的查询中

SELECT DATEDIFF(YY, birthdate, GETDATE()) - CASE WHEN( (MONTH(birthdate)*100 + DAY(birthdate)) > (MONTH(GETDATE())*100 + DAY(GETDATE())) ) THEN 1 ELSE 0 END

答案 4 :(得分:1)

这比提供的答案更简洁,更快,而且完全准确:

datediff(year,DateOfBirth,getdate()-datepart(dy,DateOfBirth)+1)

答案 5 :(得分:0)

我希望这个是完美的,只要你接受一个跳跃宝宝在连续2月29日或3月1日在非闰年上变年的算法。 @DOB必须包含几个世纪之内的日期,@ AsOf必须包含类似日期> = @DOB:

SET @Age = YEAR(@AsOf) - YEAR(@DOB) - 1
IF MONTH(@AsOf) * 100 + DAY(@AsOf) >= MONTH(@DOB) * 100 + DAY(@DOB)
    SET @Age = @Age + 1

我真的非常感谢任何测试和评论,因为我还没有找到办法打破它......但是。

已添加 - 2014年1月31日:即使初看起来看起来太粗糙了,这个看起来也很完美:

SET @Age = FLOOR(DATEDIFF(dd,@DOB,@CompareDate)/365.25)

在函数中弹出这些,这是一个测试脚本:

    SELECT dbo.fnGetAge('2/27/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/27/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/27/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/27/2008', '3/1/2012')
    -- 4 4 4 4
    SELECT dbo.fnGetAge('2/28/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/28/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/28/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/28/2008', '3/1/2012')
    -- 3 4 4 4
    SELECT dbo.fnGetAge('2/29/2008', '2/27/2012')
    SELECT dbo.fnGetAge('2/29/2008', '2/28/2012')
    SELECT dbo.fnGetAge('2/29/2008', '2/29/2012')
    SELECT dbo.fnGetAge('2/29/2008', '3/1/2012')
    -- 3 3 4 4
    SELECT dbo.fnGetAge('3/1/2008', '2/27/2012')
    SELECT dbo.fnGetAge('3/1/2008', '2/28/2012')
    SELECT dbo.fnGetAge('3/1/2008', '2/29/2012')
    SELECT dbo.fnGetAge('3/1/2008', '3/1/2012')
    -- 3 3 3 4
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2012')
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2012')
    SELECT dbo.fnGetAge('3/1/2007', '2/29/2012')
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2012')
    -- 4 4 4 5
    SELECT dbo.fnGetAge('3/1/2007', '2/27/2013')
    SELECT dbo.fnGetAge('3/1/2007', '2/28/2013')
    SELECT dbo.fnGetAge('3/1/2007', '3/1/2013')
    SELECT dbo.fnGetAge('2/27/2007', '2/28/2013')
    SELECT dbo.fnGetAge('2/28/2007', '2/28/2014')
    -- 5 5 6 6 7

干杯

PS:你可以将2月29日的决定调整为前一天,如果它漂浮在你的船上。

答案 6 :(得分:0)

SELECT Pname, DOB, DATEDIFF(YEAR, DOB, GETDATE()) AS Age
FROM tablename