我写的函数,请大家帮我优化,功能完全没有问题,就是代码质量不高/*--------------------------------------------------------------------------------
--作用:通过身份证号返回年龄
--创建: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.   

    这不是MYSQL代码,是MS SQL SERVER吧。
      

  2.   


    是的,是mssql的,区别大吗/
    另外,以下我优化后的结果:ALTER  Function zghfn_GetAge_2 (
        @strsfzh VarChar (20), --身份证号
    @today varchar(10) --当前日期
    )
    Returns int
    AS Begin
    declare @dateofbirth varchar(8) --生日 if (len(@strsfzh)<>18 and len(@strsfzh)<>15) or len(@today)<>8
    begin
    return null
    end if isdate(@today)<>1 return null --得到生日字符串
    select @dateofbirth=
    case when len(@strsfzh)=15 then '19' + substring(@strsfzh,7,6)
    when len(@strsfzh)=18 then substring(@strsfzh,7,8)
    else '' end  if isdate(@dateofbirth)<>1 return null --返回年龄
    return datediff(year,cast(@dateofbirth as datetime),cast(@today as datetime)) 
    - case when substring(@dateofbirth,5,4) > substring(@today,5,4) then 1 else 0 end
    End
      

  3.   

    MS SQL SERVER有专门的版块  或许你可以到那个版板咨询一下会有更多更专业的答复。