将日期范围分为日历日

时间:2013-01-26 04:23:55

标签: sql sql-server sql-server-2008 tsql aggregate-functions

以下是包含数据的业务场景: 有一所医院有几个房间,患者正在入院和出院。系统会要求您生成一份报告,该报告每天显示'累积'逗留时长。

来源表(访问)

Visit#(int)   AdmissionDate(datetime)  DischargeDate(datetime)
1             2012-01-01               2012-01-05
2             2012-01-03               2012-01-06
3             2011-12-29               2012-01-04

要求是返回的数据集采用以下结构。你看,停留时间随着时间的推移逐渐增加。每条记录显示特定日期的患者数量和累计住院时间(入院时间)。

CalendarDay LenghthOfStay(day) NumberOfPatients
2011-12-29  1                  1
2011-12-30  2                  1
2011-12-31  3                  1
2012-01-01  5                  2
2012-01-02  7                  2
2012-01-03  10                 3
2012-01-04  13                 3
2012-01-05  15                 2
2012-01-06  16                 1

感谢您提前投入。

1 个答案:

答案 0 :(得分:1)

我觉得这与你的previous post非常相似,虽然这不是你想要的100%,但应该有助于你开始:

select 
   CONVERT(char(10), AdmissionDate+v.number, 112)  as CalendarDay,
   ROW_NUMBER() OVER (ORDER BY CONVERT(char(10), AdmissionDate+v.number, 112))  LenghthOfStay,
   COUNT(*) NumberOfPatients
from Visit t
inner join master..spt_values v
  on v.type='P' and v.number <= DATEDIFF(d, AdmissionDate, DischargeDate) 
group by CONVERT(char(10), AdmissionDate+v.number, 112)
order by CONVERT(char(10), AdmissionDate+v.number, 112)

日期是正确的,患者是正确的。不确定你是否可以使用纯SQL获得逗留时间。

祝你好运。