1

我知道有人问过这个问题,但我发现以下代码似乎工作正常,只是想让这里的所有专业人士快速查看一下。

我在银行工作,需要它 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

4 回答 4

2

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

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

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

但是,如果此人没有经历过闰年并且取决于运行查询的时间,您可能会遇到轻微的不准确。看到这个了解更多信息

于 2013-01-30T16:55:59.503 回答
0

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

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

前任。

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

日期部分(YY,'07-30-2014' - '10-03-2000')= 1913...

1913 - 日期(年,0)...

1913 - 1900 = 13

我更喜欢这种方法,因为如果 DOB 为空,那么您将得到 0,并且无论日期系统是什么,减法DATEPART(YY,0)都可以解决。因此,如果日期系统是 1904 年,则不是 1913,而是 1917 - 1904 = 13(我知道 excel 有这个,DBs 吗??? IDK;IDC)而且,它只有 61 个字符。如果您的数据库允许空集,那么您可以NULLIF像这样使用:

SELECT DATEPART(YY,GETDATE()-COALESCE(NULLIF(DOB,''),GETDATE()))-DATEPART(YY,0)
于 2014-07-30T16:59:50.583 回答
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)

对我来说,这是有道理的,因为这就是你(或我)如何确定某人的年龄。OK:你是哪一年出生的,现在是哪一年?我们现在是几月?是你的出生月份吗?今天是什么日子?

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

于 2013-01-30T17:19:45.273 回答
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;
于 2016-04-20T15:18:02.337 回答