创作不易 只因热爱!!
热衷分享,一起成长!
“你的鼓励就是我努力付出的动力”
sqlserver中年龄计算,HIS系统中年龄计算函数
呈现的结果要求: 1周岁内显示"几月几天",1周岁以上显示"几岁"
CREATE FUNCTION dbo.FUN_GETBRNL(
@birth varchar(24), --生日
@now varchar(16), --当前时间
@dwlb varchar(2), --单位类别 0:传出单位 1:不传单位
@cal_real varchar(2), --0:周岁,1:虚岁
@brnldw1 varchar(4) --年龄单位 0:岁 1:月 3:天
)
RETURNS varchar(20)
/*******
[描述] HIS系统--由生日得出年龄
*******/
as
BEGIN
declare @birth8 varchar(8), --八位出生日期,方便比较
@now8 varchar(8), --八位当前日期,方便比较
@brnldw2 varchar(4), --年龄单位2
@year integer,
@month integer,
@day integer,
@day_dw integer, --自动选择单位辅助天数
@min integer,
@hour integer,
@mes_nl2 varchar(8), --年龄2
@mes_out varchar(20) --返回值
/*
select * from YY_BRNLDWDYK(nolock)
id nlxx nlsx brnldw1 brnldw2
01 0.00 30.00 天 小时
02 31.00 365.00 月 天
03 366.00 54750.00 岁 月
*/
--过滤传入年龄 因原birth字段扩充导致加上8个空格导致拼接birthtime调用函数时被截断
if charindex(' ',@birth)>0
select @birth = replace(@birth,' ','')
-- 再增加判断,如果传入的@birth,@now不是日期(isdate(substring(@birth,1,8))=0),则按默认值'来做
if isdate(substring(@birth,1,8))=0
select @birth='19900101'+substring(@birth,9,8)
if isdate(substring(@now,1,8))=0
select @now=convert(varchar(8), getdate(), 112)+substring(@now,9,8)
if datalength(ltrim(rtrim(@birth)))=8
select @birth = ltrim(rtrim(@birth))+'00:00:00'
select @mes_out='', @mes_nl2=''
--如果传入生日为空,则返回0岁
if (isnull(@birth,'')='')
begin
select @mes_out='0'
goto ret_sui
end
select @birth8=substring(@birth,1,8)
select @now8=substring(@now,1,8)
--修改年龄在11个月又几天年龄显示不正确
if (substring(@birth,5,2)= substring(@now,5,2)) and(substring(@birth,7,2)>substring(@now,7,2))
select @month=datediff(month,@birth8,@now8)-1
else if (substring(@birth,1,4)= substring(@now,1,4)) and (substring(@birth,5,2)< substring(@now,5,2)) and(substring(@birth,7,2)>substring(@now,7,2))
select @month=datediff(month,@birth8,@now8)
else
select @month=datediff(month,@birth8,@now8)
select @day=datediff(day,@birth8,@now8)+1
select @year=@month/12
--如果没有对应的年龄单位,则按岁返回
if @day-1<0 select @day_dw = 0
else select @day_dw = @day-1
select @brnldw1=brnldw1,@brnldw2=brnldw2 from YY_BRNLDWDYK(nolock) where @day_dw>=nlxx and @day_dw<nlsx
if @@rowcount=0
begin
select @mes_out=convert(varchar(4),@year)
goto ret_sui
end
--如果是返回‘不含单位的年龄’,则单位默认为‘岁’
if @dwlb=1----单位类别 0:传出单位 1:不传单位
select @brnldw1='岁',@brnldw2=''
--如果@brnldw1为岁,则按@year
if @brnldw1='岁'
begin
--如果已经有‘岁’为单位,且按虚岁,则不再计算第二个单位
if @cal_real='1'
begin
if (convert(int,substring(@now8,5,4))-convert(int,substring(@birth8,5,4)))>=0
select @mes_out=datediff(year,@birth8,@now8)+1
else
select @mes_out=datediff(year,@birth8,@now8)
end
--如果是返回‘不含单位的年龄’,则不再计算第二个单位
else
if @dwlb=1
begin
select @mes_out=datediff(year,@birth8,@now8)
if ((convert(int,substring(@now8,5,4))-convert(int,substring(@birth8,5,4)))<0 )
select @mes_out=@mes_out-1
end
else
begin
select @mes_out=datediff(year,@birth8,@now8)
if ((convert(int,substring(@now8,5,4))-convert(int,substring(@birth8,5,4)))<0 )
begin
select @mes_out=@mes_out-1
if @mes_out = 0
begin
select @brnldw1='月'
select @brnldw2='天'
end
end
-- 出生月份=当前月份,且当前日期<生日,则年龄减一后,应加上11个月
if (@brnldw2='月') and (@month%12=0)
begin
select @mes_nl2=convert(varchar(4),1)
end
select @birth8=convert(varchar(8),dateadd(year,@year,@birth8),112)
if @brnldw2='月'
begin
if @month%12>0 --
select @mes_nl2=convert(varchar(4),@month%12) --
end
end
end
/*** --如果@brnldw1为月,则按@month
if @brnldw1='月'
begin
if (substring(@birth8,7,2)>substring(@now8,7,2) )
begin
select @mes_out=convert(varchar(4),@month)
if @mes_out>0
select @birth8=convert(varchar(8),dateadd(month,@month,@birth8),112)
end
else
begin
select @mes_out=convert(varchar(4),@month)
select @birth8=convert(varchar(8),dateadd(month,@month,@birth8),112)
end
if @brnldw2='天'
begin
select @day=datediff(day,@birth8,@now8)
if @day>0
select @mes_nl2=convert(varchar(4),@day)
end
end
--如果@brnldw1为天,则按@day
if @brnldw1='天'
begin
select @mes_out=convert(varchar(4),@day-1)
select @birth8=convert(varchar(8),dateadd(day,@day,@birth8),112)
if @brnldw2='小时'
begin
if (substring(@birth,9,2)<>'') and (substring(@now,9,2)<>'')
begin
select @hour=convert(int,substring(@now,9,2))-convert(int,substring(@birth,9,2))
if @hour>=0
select @mes_nl2=convert(varchar(4),@hour)
else--如果为负数(小时不足),则天-1,小时+24
begin
if @hour = 0
begin
select @mes_out=convert(varchar(4),@day)
--select @mes_nl2=convert(varchar(4),@hour)
end
else
begin
select @mes_out=convert(varchar(4),@day-1)
select @mes_nl2=convert(varchar(4),24+@hour)
end
end
end
select @brnldw2='时'
end
end
if @brnldw1='小时'
begin
select @hour=datediff(hour,@birth8,@now8)
if (substring(@birth,9,2)<>'') and (substring(@now,9,2)<>'')
begin
select @hour=convert(int,substring(@now,9,2))-convert(int,substring(@birth,9,2))+@hour
if(@hour<0) select @hour=@hour+24
end
select @mes_out=convert(varchar(4),@hour)
if @brnldw2='分钟'
begin
select @min=convert(int,substring(@now,12,2))-convert(int,substring(@birth,12,2))
if (@hour<>0) and (@min<0)
begin
select @min=@min+60
select @mes_out=@hour-1
end
select @mes_nl2 =@min
end
select @brnldw1='时'
select @brnldw2='分'
end
***/
if @dwlb=0--加单位
begin
select @mes_out=@mes_out+@brnldw1
if @mes_nl2<>''
select @mes_nl2=@mes_nl2+@brnldw2
end
select @mes_out=@mes_out+@mes_nl2
RETURN (@mes_out)
ret_sui:
begin
if @dwlb=0
select @mes_out=@mes_out+'岁'
RETURN (@mes_out)
end
END
GO
朋友,你怎么看…
但行好事,莫问前程!
end
**你好呀,我是一个医信行业工程师,喜欢学习,喜欢搞机,喜欢各种捣,也会持续分享,如果喜欢我,那就关注我吧!**
往期精彩:
健康码项目笔记, python之flask框架内新增搭建api(一)
健康码项目笔记, python之flask框架内新增搭建api(二)
健康码项目笔记, python之flask框架内新增搭建api(三)
作者|医信工程师随笔|Carltiger_github
图片|自制|侵删
关注我,我们共同成长
“你的鼓励就是我分享的动力”