You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:45:01