我写的函数,请大家帮我优化,功能完全没有问题,就是代码质量不高/*--------------------------------------------------------------------------------
--作用:通过身份证号返回年龄
--创建: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
--作用:通过身份证号返回年龄
--创建: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
解决方案 »
- mysql-5.5.25a-winx64 to mysql-5.5.29数据升级
- 请问,数据库崩溃,有没有什么办法,可以让linux系统自己自动恢复?
- 不太懂mysql的查询,如果查“where name like 'a'”会把全中文姓名也查出来
- 新手请教各位高人:关联查询问题
- 最基础的MySQL连接问题,试过论坛里的方法了都无效。
- 刚在本地装上MySQL-Front,联接数据库时提示:Client does not support authentication ~~~
- 请问这个SQL语句怎么写?
- now()可否做建表的默认项?
- 如何写sql在mysql中,一个字段(int)自动加1,用create table回复马上给分.
- .php文件怎样导入MySQL?
- mysql新手,请教过来人推荐一本经典的初学教材,谢谢。(权威点的)
- utf-8問題~怎麼插都亂碼~
是的,是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