2008-11-12 217 views
8

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

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

回答

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 
+2

你真的可以把相关的代码放在你的答案吗?链接到其他网站可以(而且确实)中断,所以如果链接不再有效,将来这个答案可能不会有用。 – 2008-11-12 12:24:58

+0

@Tim C +1用于建议添加代码,因为该网站目前处于关闭状态,并且此答案在仅有链接时将无法使用。 – 2011-11-01 22:42:16

5

还有另一种方法就是有点简单:

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

因为这里的四舍五入是非常精细的,这是差不多完全准确。例外情况如此复杂以至于它们几乎都是幽默的:如果我们A)在6:00 AM之前询问年龄,B)在该人的生日和C)他们的生日在那之后,每四年返回的年龄将是一年太年轻2月28日。在我的情况下,这是一个完全可以接受的折中方案。

+0

如果用一个静态值替换GETDATE(),你会在午夜检查后更频繁地点击异常。它看起来像从中午检查而不是午夜会起作用。 – Guvante 2014-09-12 16:50:39

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 
1

该方案显示在一个查询如何不变量

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

这比提供的答案更简洁和快一点,并且完全准确:

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

当GetDate()是出生日期时,此方法不起作用。这是一个例子,其中人应该是40岁,但它只返回39.`SELECT datediff(year,'1/29/1973',CAST('2013年1月29日'作为日期时间) - datepart(dy,'1/29/1973'))` – 2013-01-29 20:39:18

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日的决定,是一个早一天如果你的船浮筒。

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