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

news2024/12/25 9:13:04

创作不易 只因热爱!!

热衷分享,一起成长!

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


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

图片|自制|侵删

关注我,我们共同成长

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇昌联信拼多多电商有哪些热门话题?

随着互联网技术的飞速发展&#xff0c;电子商务已经成为人们日常生活的一部分。作为中国领先的电商平台之一&#xff0c;拼多多凭借其独特的商业模式和营销策略迅速崛起&#xff0c;吸引了大量消费者的关注。那么&#xff0c;在汇昌联信拼多多电商领域&#xff0c;有哪些热门话…

SpringBoot启动原理详解(二)

透彻理解SpringBoot启动原理&#xff08;二&#xff09; 照旧一张Spring启动顺序图我们对Spring启动原理有多少理解呢&#xff08;问题回顾&#xff09;关于Spring启动原理的若干问题1.init-method、PostConstruct、afterPropertiesSet 三个方法的执行顺序。2.Spring 何时装配A…

【C语言】数组栈的实现

栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#…

在图神经网络(GNN)上进行关系推理的新架构

开发能够学习推理的模型是一个众所周知的具有挑战性的问题&#xff0c;在这个领域中&#xff0c;使用图神经网络&#xff08;GNNs&#xff09;似乎是一个自然的选择。然而&#xff0c;以往关于使用GNNs进行推理的工作表明&#xff0c;当这些模型面对需要比训练时更长推理链的测…

听见未来,AI+Audio|2025中国国际音频产业大会(GAS)

随着AI技术的创新与突破&#xff0c; 音频行业正步入前所未有的黄金发展期。 2025中国国际音频产业大会&#xff0c; “AI对行业发展的影响” 将成为讨论的热点之一。 3月26-27日&#xff0c;2025中国国际音频产业大会&#xff08;GAS&#xff09;将在上海 张江科学会堂召…

Conda和Pip有什么区别?

conda和pip是Python中两种常用的包管理工具&#xff0c;它们在用途、包来源以及环境管理等方面存在区别。以下是具体分析&#xff1a; 用途 conda&#xff1a;conda是Anaconda发行版中的包管理工具&#xff0c;可以管理包括非Python软件包在内的各种包。它是一个全面的环境管理…

【iOS】GCD

参考文章&#xff1a;GCD函数和队列原理探索 之前写项目的时候&#xff0c;进行耗时的网络请求使用GCD处理过异步请求&#xff0c;但对一些概念都很模糊&#xff0c;这次就来系统学习一下GCD相关 相关概念 什么是GCD&#xff1f; Grand Center Dispatch简称GCD&#xff0c;是…

python-docx 如何将列表中的值提取到段落中的run以及保存为多个文档?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

使用pfld模型进行表盘读数检测

目录 1. 下载项目和数据集2. 配置环境3. 训练和测试3.1 训练3.2 测试 4. 参考 使用pfld模型对压力表进行读表检测 1. 下载项目和数据集 下载项目&#xff1a; git clone https://github.com/zhouayi/pfld.git下载数据集&#xff1a; wget https://github.com/zhouayi/pfld/r…

Vue3扁平化Tree组件的前端分页实现

大家好&#xff0c;我是小卷。得益于JuanTree的扁平化设计&#xff0c;在数据量很大的情况下除了懒加载&#xff0c;使用前端分页也是一种解决渲染性能问题的可选方案。 用法 要实现的文档&#xff1a; 分页效果&#xff1a; 实现 新增属性&#xff1a; 组件setup方法中新增…

java 对象模型的个人理解

文章目录 一、OOP-KCLASS 模型二、疑惑2.1 为什么还需要一个 Class对象&#xff1f;2.2 new 关键字和 Class.newInstance() 的区别&#xff1f; 一、OOP-KCLASS 模型 java 采用了field和method分离的方式&#xff0c;field组成实例 obj &#xff0c;存储在堆区&#xff0c;而m…

web小项目-曼波生日录(Servlet+JSP+MySQL)

效果演示&#xff1a; 当记录条数过多时会自动出现滚轮&#xff0c;数据不会超出紫框 数据库实时记录&#xff1a; 项目源代码以及所用到的资源&#xff1a; 链接: https://pan.baidu.com/s/1w0czmH9xBfetk7CZ7RNbtQ?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机App…

【数据结构】堆,优先级队列

目录 堆堆的性质大根堆的模拟实现接口实现构造方法建堆入堆判满删除判空获取堆顶元素 Java中的PriorityQueue实现的接口构造方法常用方法PriorityQueue注意事项 练习 堆 如果有一个集合K {k0&#xff0c;k1&#xff0c; k2&#xff0c;…&#xff0c;kn-1}&#xff0c;把它的…

Listen(sockfd,backlog)监听函数的第二个参数到底是什么?深度解释

listen队列剖析 int listen(int sockfd,int backlog) backlog : 监听套接字队列 对于一个调用监听的套接字&#xff0c;系统会维护给这个套接字两个队列 1. 未完成连接队列 //当客户端发生三次握手的第一次syn包给服务器的时候&#xff0c;服务器就会再未完成队列中创建…

数据库处理表

首先先创建库&#xff0c;然后创建需要的这三个表 用dese表名查看 然后题目要求对表进行修改 用alter table这个语法来对表进行修改 modify为修改字段 需要修改的字段的属性类型改变为的属性 最后用descStudent查看 第二题需要创建索引 创建索引createindex索引名称 cre…

世界启动Ⅷ--AI视频制作-方案与创新

1.文本/图片生成视频顾名思义&#xff0c;就是输入一段文本描述/上传一张图片即可生成对应的视频。我们常见的Runway、Pika、NeverEnds、Pixverse、svd等都属于此类。比如runway的影视风格Pika的动漫风格NeverEnds的人像模特当然还有一些外延应用&#xff0c;例如最近比较火的阿…

C++客户端Qt开发——Qt窗口(工具栏)

2.工具栏 使用QToolBar表示工具栏对象&#xff0c;一个窗口可以有多个工具栏&#xff0c;也可以没有&#xff0c;工具栏往往也可以手动移动位置 ①设置工具栏 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<…

JavaSE--基础语法--继承和多态(第三期)

一.继承 1.1我们为什么需要继承? 首先&#xff0c;Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是 现实世界错综复杂&#xff0c;事物之间可能会存在一些关联&#xff0c;那在设计程…

开发AI自动直播工具需要了解的源代码!

随着人工智能技术的快速发展&#xff0c;AI自动直播工具成为了现代直播领域的一大创新&#xff0c;这些工具利用先进的算法和机器学习模型&#xff0c;能够自动化地生成、编辑和播出直播内容&#xff0c;极大地提高了直播的效率和质量。 然而&#xff0c;要开发一款功能强大的…

10 个顶级的PPT生成AI工具盘点,一文把所有好用软件尽收囊中!

你是否希望在工作中制作 PPT 演示文稿&#xff0c;与他人分享你的洞见&#xff0c;或是发表演讲&#xff1f;然而&#xff0c;使用传统的 PPT 制作方式既耗时又费力&#xff0c;步入 AI 时代后&#xff0c;人们寻求更智能、更简便的 PPT 演示文稿制作方法。 目前市场上出现了一…