以前写的,在求年龄时,其实还有些符号需要处理,比如$,可以参考下。同时,我对身份证号没没有去全面的研究,只是能在我们环境中满足需求。 关于函数到底是否可以设默认值,我以前看到有些资料上说不能设置。也许是从别的角度考虑吧,只是这个默认值是真的不彻底,起码存储过程有默认值的参数可以不传值,但函数至少要传个default进去。我只是认为默认值是可以设置,但调用时不够理想而已。
--王红波 /
/**/ /*
Description:
Get age from id_card_no
Return:
age
Demo:
select dbo.fn_get_age_from_card_no('420621198303064511','2008')
select dbo.fn_get_age_from_card_no('420621198303064511',default) ---传default
*/
create function [ dbo ] . [ fn_get_age_from_card_no ]
( @card_no varchar ( 50 ) -- 身份证号
, @year int = 2008 -- 当前年份
)
returns varchar ( 10 )
as
begin
declare @r varchar ( 10 )
set @r =
@year - left ( case when len ( @card_no ) = 15
then ' 19 ' + replace ( replace ( substring ( @card_no , 7 , 6 ), ' . ' , '' ), ' , ' , '' )
when len ( @card_no ) = 18
then replace ( replace ( substring ( @card_no , 7 , 8 ), ' . ' , '' ), ' , ' , '' )
else - 1 end , 4 )
return ( case when @r = @year + 1 then ' Unknown ' else @r end )
end