首页 > 数据库 >震惊,刷新我的认知,医疗信息数据库sqlserver中计算年龄的sql函数写了200行...

震惊,刷新我的认知,医疗信息数据库sqlserver中计算年龄的sql函数写了200行...

时间:2024-07-27 20:58:13浏览次数:16  
标签:200 varchar birth ... -- substring mes sql select

创作不易 只因热爱!!

热衷分享,一起成长!

“你的鼓励就是我努力付出的动力”


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

图片|自制|侵删

关注我,我们共同成长

“你的鼓励就是我分享的动力”

标签:200,varchar,birth,...,--,substring,mes,sql,select
From: https://blog.csdn.net/weixin_43688085/article/details/140700832

相关文章

  • 【docker】配置mysql及数据持久化
    【docker】配置mysql及数据持久化前言一、使用docker时常用的命令1、用usermod命令向docker用户组添加新用户2、给docker的images打标签二、docker相关的环境配置1、配置文件的生效条件/etc/profile文件的环境变量所有用户可用,只在用户登陆的时候执行一次,安装编译好的全......
  • 2023.7.2-3-4Mssql xp_cmdshell提权
    1.概念Mssql和SQLsever的一个产品的不同名称。都属于微软公司旗下。而上述Mssqlxp_cmdshell提权也属于数据库提权的一种。主要依赖于sqlserver自带的存储过程。1.1xp_cmdshell提权扩展存储过程中xp_cmdshell是一个开放接口,可以让sqlsever调用cmd命令。此过程在SQLsever......
  • SQL------SQL性能分析
    SQL性能分析●SQL执行频率MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的insert、update、delete、select的访问频次:showglobastatuslike'Com_______';查看当前数据库的全局SQL语句的访问频次●慢......
  • 7.22-27MY&MS&ORA等SQL数据库提权
    7.22-27MY&MS&ORA等SQL数据库提权思路:在利用系统溢出漏洞无果情况下,可以采用数据库提权;前提:数据库服务开启,且获得数据库最高权限账号密码;除Access数据库外,其他数据库基本都存在提权可能;Mysql提权思路:服务探针-信息收集-提权利用-获取权限;1、读取默认数据库配置文件;(了解其......
  • 【MySQL】MySQL基础知识:什么是主键?什么是外键?主键和外键有什么区别?外键有什么问题?
    在关系型数据库系统中,如MySQL,主键(PrimaryKey)和外键(ForeignKey)是两个基本且重要的概念,它们在数据库设计和数据维护中扮演着重要的角色。本文将从主键和外键的基本概念入手,详细解析它们之间的区别,并探讨外键在实际应用中可能遇到的问题。......
  • Linux: 更新系统相关依赖命令yum update执行失败: One of the configured repositorie
    环境:CentOS7(ISO映像文件=CentOS-7-x86_64-DVD-2009.iso)解决思路:系统repo镜像源连接问题导致执行失败,切换repo为国内源即可#切换仓库镜像源curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#或者wget-O/etc/yum.rep......
  • Flink SQL 的工作机制
    前言FlinkSQL引擎的工作流总结如图所示。 从图中可以看出,一段查询SQL/使用TableAPI编写的程序(以下简称TableAPI代码)从输入到编译为可执行的JobGraph主要经历如下几个阶段:将SQL文本/TableAPI代码转化为逻辑执行计划(LogicalPlan)LogicalPlan通过优化器优......
  • sql优化
    建表需要注意的:能用int的不要用varchar,如果非负的话用UNSIGNEDint,Ip地址用int存(使用inet_aton函数转换索引用没用,用的哪个索引,foreceindex指定索引in和exist:in需要对子表全表扫描,exist是把外面数据一条条带进来,子表数据量大时往往exist快子查询和join,子查询就是where条件......
  • sql注入漏洞复现
    and1=1正常and1=2报错从这就已经说明是sql数字型注入了上sqlmap验证一下存在布尔盲注,时间盲注......我是在漏洞盒子上提交的,能不能通过看运气吧下面这个漏洞已经是很久之前的了,现在已经是修复了,当时还是太年轻了......当时复现过程没有做好,截图也已经删掉了............
  • 菜鸟通关sqli-labs记录(1-54)
    目录基础环境所需知识Mysql系统数据库union联合查询通关过程通用思路1.第一关2.第二关2.1判断有无注入点2.2猜解列名数量(字段数量)2.3报错,判断回显点2.4信息收集2.5使用对应的SQL注入3.第三关4.第四关5.第五关6.第六关7.第七关8.第八关9.第九关10.第十关11.第十一关12.......