我知道有人问过这个问题,但我发现下面的代码看起来工作正常,只是想让所有专业人员快速浏览一下。
我在银行工作,需要它在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',
答案 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;