使用SQL Server从sysdate和birthdate计算年龄

时间:2012-10-31 15:28:48

标签: sql sql-server

  

可能重复:
  How to calculate age in T-SQL with years, months, and days

我只是尝试使用生日变量

计算年龄(以年为单位)
1932-04-29 00:00:00.000
SQL Server中的

和SYSDATETIME(),其中是

SELECT year(Sysdatetime() - Birthdate) as Age

产生(令人惊讶):1980

我错过了什么?我期望得到80!

4 个答案:

答案 0 :(得分:8)

计算年龄并不像第一次出现那么简单。

如果你使用Datediff,你会得到绝对年份的差异,而不是年龄。

例如

select DATEDIFF(yy, '1980-12-31', getdate())

将返回32,而有关人员的年龄为31岁。

这可能足以满足您的需要。 更准确,但仍然错误,你可以使用

select convert(int,DATEDIFF(d, '1933-10-31', getdate())/365.25)

当时大多数

或者你可以写一个更复杂的功能......

答案 1 :(得分:1)

CREATE Function [dbo].[F_GetAge]( @RefDate Datetime,@Birthdate Datetime) Returns Int as
/*
200040916 Thomas Wassermann
*/
Begin
    Declare @Alter Int
    if @RefDate>@Birthdate
    Select @Alter=(DatePart(yy,CAst(@Refdate-@Birthdate -1 as Float))-1900)
    else select @Alter=0
    Return(@Alter) 
end

答案 2 :(得分:1)

快速而肮脏。可能会有一些错误在闰年等等。

-- quick and dirty age in years

declare @birthday datetime

set @birthday = '19320429'

-- this is pretty close, but could have problems with leap years, etc.
select floor(datediff(day, @birthday, CURRENT_TIMESTAMP) / 365.25)

答案 3 :(得分:0)

这里会发生以下情况:

  1. 自1900-01-01T00:00:00
  2. 以来,两个日期都被转换为浮点数
  3. 浮动相互减去,产生它们之间的天数
  4. 通过向基准日期添加天数将结果转换回日期
  5. 要正确计算差异,请使用DATEDIFF:http://msdn.microsoft.com/en-us/library/ms189794.aspx

    但仍存在问题。请参阅此处以获取完整的解决方案:How to calculate age (in years) based on Date of Birth and getDate()