在SQL Server数据库中,我记录人们的出生日期。是否有一种直接的方法只使用SQL来计算给定日期的人的年龄?
使用 DATEDIFF(YEAR,DateOfBirth,GETDATE())不起作用,因为这只会查看日期的年份部分。例如 DATEDIFF(年份,'2007年12月31日','2008年1月1日')返回1.
答案 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