SQL Server存储过程用游标/while循环生成处方用药剂量时间报表
用药报表存储过程实现需求说明
业务背景
医生为患者开具处方,每张处方对应多个药品,每个药品有固定服药间隔频次(每X小时服用一次),以及明确的用药起止时间。
表结构明细
- 患者表:
Patients - 处方表:
Prescription,与患者为一对一关系 - 处方明细表:
Prescription_Detail,为处方表的明细数据,存储药品信息、开始日期(date类型)、开始时间(time类型)、结束日期、结束时间、frequencyID,与频次表Frequency为一对一关系 - 频次表:
Frequency,存储用药间隔的小时数
需求说明
编写存储过程遍历表中数据,为每张处方生成用药报表,针对每个药品,根据其起止日期时间、用药频次,计算所有服药的剂量序号和对应服药时间。
示例场景
1号患者的1号药品从2021-11-20 20:00开始服用,间隔6小时,共服用2天,输出结果如下:
Patient Drug Dose 1 1 1 / 20-11-2021 20:00 (剂量序号 / 服药时间) 1 1 2 / 21-11-2021 02:00 (间隔6小时得到下一剂服药时间) 1 1 3 / 21-11-2021 08:00 1 1 4 / 21-11-2021 14:00
现有实现方案
单条处方明细循环实现示例
DECLARE @minDate datetime , @MaxDate datetime, @CurrDate datetime,@index int,@hour int SELECT @minDate = min(startdate), @MaxDate = max(EndDate) , @hour=max(Frequency.HourValue) FROM Prescription_Detail inner join Frequency on Prescription_Detail.FreqID = Frequency.Id WHERE Prescription_Detail.Id = 1 set @CurrDate = @minDate set @index = 1 while @CurrDate <= @MaxDate begin PRINT CONVERT(varchar, @index) + '/' + CONVERT(VARCHAR, @CurrDate) set @CurrDate = DATEADD(HOUR, @hour, cast(@CurrDate as datetime)) set @index = @index + 1 end
最优实现方案
最优解决方案基于Numbers表实现,可替代循环方案,执行效率更高,适合批量处理全表处方数据。
内容的提问来源于stack exchange,提问作者Maher Khalil
相关产品推荐
相关产品推荐

