我這邊有一個業務,需要客戶填寫身份證號,自動計算他的出生日期和年齡
在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
調用后結果: