我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄
在sql中,具体的存储过程实现是这样的:
/*********************************************** 根据身份证号计算出生日期和年龄 Date:2017-10-15 Author:xzl 条件:身份证号码 返回:出生日期和年龄 ***********************************************/ /*** *根据身份证号计算出生日期和年龄 ***/ create proc [dbo].[sp_GetBirthDate_Age] @IDCard varchar(20), @BirthDate varchar(20) output, @Age int output as begin --声明变量-- declare @BirthDateStr varchar(10) declare @YearStr varchar(10) declare @MonthStr varchar(10) declare @DayStr varchar(10) declare @NowDateStr varchar(20) declare @AgeStr varchar(10) ----1、根据身份证号,计算出生日期--- --设置IDCard值 --set @IDCard =\'445182199403123781\' --1)获取身份证号中年月日部分(返回:19940312)-- set @BirthDateStr = SUBSTRING(@IDCard,7,8) --2)将获取年月日字符串转化为对应日期格式-- --2.1)获取年部分-- set @YearStr = SUBSTRING(@BirthDateStr,1,4) --2.2)获取月部分-- set @MonthStr = SUBSTRING(@BirthDateStr,5,2) --2.3)获取日部分-- set @DayStr = SUBSTRING(@BirthDateStr,7,2) --3)返回组合后的日期--- set @BirthDate = @YearStr +\'-\'+@MonthStr+\'-\'+@DayStr --2、根据出生日期和当前日期,计算年龄-- --1)获取当前时间的日期部分(返回:2017-10-15)-- set @NowDateStr = CONVERT(varchar(10),GETDATE(),23) --2)获取当前日期与出生日期的年份(年龄) 返回:23岁 -- set @AgeStr = DATEDIFF(YEAR,@BirthDate,@NowDateStr) --3)判断当前日期与出生日期(是否过生日,未过生日减去1岁)-- if(SUBSTRING(@BirthDate,6,5) <= SUBSTRING(@NowDateStr,6,5)) begin --Cast()将字符转化为数字函数 set @Age = CAST(@AgeStr as int) end else begin set @Age = CAST(@AgeStr as int)-1 end --输出计算后的返回结果-- select @BirthDate as 出生日期,@Age as 年龄 end
在sql中,执行上面可在可编程性-->存储过程中看到创建的存储过程
存储过程的调用:
--测试1:出生日期已过当前日期的--- declare @IDCard varchar(20) declare @BirthDate varchar(20) declare @Age int set @IDCard=\'445182199410103781\' exec sp_GetBirthDate_Age @IDCard,@BirthDate output,@Age output --返回结果-- --出生日期:1994-10-10 年龄: 23
--测试2:出生日期未过当前日期的--- declare @IDCard varchar(20) declare @BirthDate varchar(20) declare @Age int set @IDCard=\'445182199410183781\' exec sp_GetBirthDate_Age @IDCard,@BirthDate output,@Age output --返回结果-- --出生日期:1994-10-18 年龄: 22
调用后结果: