在T-SQL查询中计算年龄

时间:2013-01-30 16:47:27

标签: sql-server database tsql

我知道有人问过这个问题,但我发现下面的代码看起来工作正常,只是想让所有专业人员快速浏览一下。

我在银行工作,需要它在100%的时间内工作,我注意到很多查询有时可能不正确。另外N.NameBirthdate是我从数据库中提取的列。

提前谢谢你。

SELECT 
   CASE 
      WHEN (MONTH(GETDATE()) * 100) + DAY(GETDATE()) >= (MONTH(N.NameBirthdate) * 100) +  DAY(N.NameBirthdate) 
      THEN DATEDIFF(Year, N.NameBirthdate, GETDATE()) 
      ELSE DATEDIFF(Year, N.NameBirthdate, GETDATE())-1 
   END AS 'Age',

4 个答案:

答案 0 :(得分:1)

好吧,我不确定这是否会100%有效,但您是否愿意接受其他查询提示?我一直用这个:

SELECT FLOOR(DATEDIFF(d, N.NameBirthDate, GETDATE()) / 365.25) AS Age

如果我需要计算一个年龄。 365.25是允许闰年。

但如果此人没有经历闰年并且根据查询运行的时间,您可能会遇到轻微的不准确之处。有关详细信息,请参阅this

答案 1 :(得分:0)

你有什么应该工作。我可能会使用一个变体,只是因为我发现它更具可读性/显而易见性:

SELECT DATEDIFF(Year, N.NameBirthdate,getdate()) - 
    (case when month(N.NameBirthdate) > month(getdate()) or (month(N.NameBirthdate) = month(getdate()) and day(N.NameBirthdate) > day(getdate()) ) then 1 else 0 end)

对我来说,这是有道理的,因为这就是你(或我)的方式,决定某人的年龄。好的:你出生在哪一年,现在是哪一年?我们现在几个月?这是你的出生月份吗?今天是星期几?

我个人不喜欢闰年的做法。首先,它不是365.25,而是.24。确切地说,它是365.24219647。如果你使用.25,你就错了。示例:http://www.sqlfiddle.com/#!3/d41d8/8267

答案 2 :(得分:0)

我知道这已经过时了,但我正在四处寻找一种快速计算某人年龄的方法,而我找不到任何东西。这些答案工作正常,但我不想要任何案例陈述,我希望它完全准确,所以我开发了这个:

SELECT DATEPART(YY,GETDATE()-COALESCE(DOB,GETDATE()))-DATEPART(YY,0)

实施例

DATEPART(YY,GETDATE()-COALESCE(DOB,GETDATE()))

DATEPART(YY,'07 -30-2014' - '10 -03-2000')= 1913 ......

1913年 - DATEPART(YY,0)......

1913 - 1900 = 13

我更喜欢这种方法,因为如果DOB为null,那么无论日期系统是什么,你都会得到0,减去DATEPART(YY,0)会占用它。因此,如果不知何时日期系统是1904(我知道excel有这个,DBs ??? IDK; IDC)而不是1913年你将有1917-1904 = 13而且,它只有61个字符。如果您的DB允许空集,那么您可以使用NULLIF,如下所示:

SELECT DATEPART(YY,GETDATE()-COALESCE(NULLIF(DOB,''),GETDATE()))-DATEPART(YY,0)

答案 3 :(得分:0)

SELECT DATEDIFF(yy, BirthDate, GETDATE()) - CASE
    WHEN MONTH(BirthDate) > MONTH(GETDATE())
          OR (MONTH(BirthDate) = MONTH(GETDATE())
             AND DAY(BirthDate) > DAY(GETDATE()))
    THEN 1
    ELSE 0
END AS Age;