/*--------------------------------------------------------------------------------
--作用:通过身份证号返回年龄
--创建:2010-6-28
--更新:2010-6-28 16:36--注:调用该函数时,传入身份证号,及当前日期,则计算出年龄,当前日期格式为YYYYMMDD,没有定界符
--调用示例: select dbo.zghfn_getage('120106197605078987','20100628')
----------------------------------------------------------------------------------*/
ALTER   Function zghfn_GetAge (
    @strsfzh VarChar (20), --身份证号
@today varchar(10) --当前日期
)
Returns int
AS Begin
declare @dateofbirth varchar(8) --生日
declare @age int
declare @nian1 varchar(4)
declare @yuefen1 varchar(4) declare @nian2 varchar(4)
declare @yuefen2 varchar(4) if @strsfzh='' or @today=''
begin
--没有传入身份证号或当前日期,返回 null
return null
end if (len(@strsfzh)<>18 and len(@strsfzh)<>15) or len(@today)<>8
begin
return null
end --得到生日字符串
select @dateofbirth=
case when len(@strsfzh)=15 then '19' + substring(@strsfzh,7,2)+substring(@strsfzh,9,2)+substring(@strsfzh,11,2) 
when len(@strsfzh)=18 then substring(@strsfzh,7,4)+substring(@strsfzh,11,2)+substring(@strsfzh,13,2) 
else '' end  if @dateofbirth=''
begin
return null
end --取生日的年@dateofbirth和月
set @nian1=left(@dateofbirth,4)
set @yuefen1=substring(@dateofbirth,5,4) --取当前的年和月
set @nian2=left(@today,4)
set @yuefen2=substring(@today,5,4) --计算年龄
set @age=cast(@nian2 as int)-cast(@nian1 as int)
--set @age=@year1 --如果月份不足,将年龄减1
if @yuefen2<@yuefen1
begin
set @age=@age-1
end --返回年龄
return @age
End

解决方案 »

  1.   

    alter Function zghfn_GetAge (
        @strsfzh VarChar (20)        --身份证号
    )
    Returns int
    AS 
    Begin
        if len(@strsfzh)<>18 and len(@strsfzh)<>15
        begin
            return null
        end
        
        declare @dateofbirth varchar(20)
    set @dateofbirth=substring(@strsfzh,7,4)+'-'+substring(@strsfzh,11,2)+'-'+substring(@strsfzh,13,2)

    return datediff(year,convert(datetime,@dateofbirth),getdate())
    Endprint dbo.zghfn_GetAge('430211198712014569')
      

  2.   

    DECLARE @STR VARCHAR(20)
    SELECT @STR='120106197608078987'
    SELECT DATEDIFF(YEAR,CAST(SUBSTRING(@STR,7,8) AS DATETIME),GETDATE())
    -CASE WHEN CAST(SUBSTRING(@STR,11,4) AS INT)>(MONTH(GETDATE())*100+DAY(GETDATE())) THEN 1 ELSE 0 END
      

  3.   

    declare @dateofbirth varchar(20)
    select @dateofbirth='1984-11-11'
    select DATEDIFF(YEAR,@dateofbirth,GETDATE()) select @dateofbirth=
        case when len(@strsfzh)=15 then '19' + substring(@strsfzh,7,2)+'-'+substring(@strsfzh,9,2)+'-'+substring(@strsfzh,11,2) 
            when len(@strsfzh)=18 then substring(@strsfzh,7,4)+'-'+substring(@strsfzh,11,2)+'-'+substring(@strsfzh,13,2) 
            else '' end     if @dateofbirth=''
        begin
            return null
        end   set age=DATEDIFF(YEAR,@dateofbirth,GETDATE())
        --返回年龄
        return @age
      

  4.   

    是的,可以通过datediff简化代码
      

  5.   


    不明白为何要减,
    CAST(SUBSTRING(@STR,11,4) AS INT)>(MONTH(GETDATE())*100+DAY(GETDATE()))是什么?
    没看明白~求高人指点~
      

  6.   


    if OBJECT_ID('dbo.ufn_getage') is not null
     drop function dbo.ufn_getage;
    go
    create function dbo.ufn_getage(@id varchar(18))
    returns int as
    begin
    declare @birthday datetime;set @birthday=case LEN(@id) 
     when 15 then CAST(SUBSTRING(@id,7,6) as datetime)
     when 18 then CAST(SUBSTRING(@id,7,8) as datetime)
     else null end;
     
    return datediff(mm,@birthday,GETDATE())/12;
    end
    go
      

  7.   

    if OBJECT_ID('dbo.ufn_getage') is not null
     drop function dbo.ufn_getage;
    go
    create function dbo.ufn_getage(@id varchar(18))
    returns int as
    begin
    declare @birthday datetime;set @birthday=case LEN(@id) 
     when 15 then CAST('19'+SUBSTRING(@id,7,6) as datetime)
     when 18 then CAST(SUBSTRING(@id,7,8) as datetime)
     else null end;
     
    return datediff(mm,@birthday,GETDATE())/12;
    end
    go
    select dbo.ufn_getage('654123198806263118')
    /*-----------
    22*/
    select dbo.ufn_getage('113343450321432')
    /*-----------
    65
    */
      

  8.   

    如果你是1990年1月2日生的,那么在2000年1月1日时,你是9岁,但DATEDIFF(YEAR)会返回10
      

  9.   

    用datediff(month,date1,date2)/12来代替datediff(year,date1,date2)可以减小误差