/*--------------------------------------------------------------------------------
--作用:通过身份证号返回年龄
--创建: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
解决方案 »
- Studio Express 建立存储过程运行直接报错
- 传入函数参数出错
- 请问原始数据是float类型,我把他写到新表以后,保留1-3位小数或者是整数,新表的列应该是什么数据类型才对?
- 这时我第一个项目,在统计报表时遇到了问题,请大家帮助,向大家学习.谢谢!!!
- 扩展名为DB数据库问题
- 登录和用户有何区别?
- sql server 中修改密码的问题
- SQL Server 免费版 支持的1G内存是什么意思
- 请问函数和存储过程有什么区别?
- 楼主哭了,关于sql server加锁问题,急!在线等待!!
- 请教一个链接服务器访问慢的问题
- 谁做过SqlServer2005数据表到Oracle的同步?帮帮我吧,一直不成功。
@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')
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
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
不明白为何要减,
CAST(SUBSTRING(@STR,11,4) AS INT)>(MONTH(GETDATE())*100+DAY(GETDATE()))是什么?
没看明白~求高人指点~
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
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
*/