SQL计算床位入住率:PatientAdmissions表总住院时长查询报错求助
解决PatientAdmissions表的住院时长统计问题
没问题,我来帮你搞定这个SQL查询!首先得明确核心需求:我们要统计用户指定时间段内的总住院时长(所有符合条件的住院记录中,入院到出院的日期差总和),同时算出该指定时间段的总天数。下面分两种常见场景给出具体的SQL写法,适配不同数据库。
场景1:住院记录完全在指定时间段内
这种情况是指患者的入院日期(AdmitDate)不早于用户提供的FromDate,且出院日期(DischargeDate)不晚于ToDate。
MySQL 写法
SELECT -- 计算所有符合条件的住院记录总时长(单位:天) SUM(DATEDIFF(DischargeDate, AdmitDate)) AS TotalStayDays, -- 计算指定时间段的总天数(包含首尾日期,若不需要+1则去掉) DATEDIFF(@ToDate, @FromDate) + 1 AS PeriodTotalDays FROM PatientAdmissions WHERE AdmitDate >= @FromDate AND DischargeDate <= @ToDate;
说明:
DATEDIFF(a,b)在MySQL中返回的是a - b的天数差,如果业务要求"当天入院出院算1天",可以把SUM里的部分改成SUM(DATEDIFF(DischargeDate, AdmitDate) + 1)。
SQL Server 写法
SELECT SUM(DATEDIFF(DAY, AdmitDate, DischargeDate)) AS TotalStayDays, DATEDIFF(DAY, @FromDate, @ToDate) + 1 AS PeriodTotalDays FROM PatientAdmissions WHERE AdmitDate >= @FromDate AND DischargeDate <= @ToDate;
说明:SQL Server的
DATEDIFF需要指定时间单位(这里用DAY),第一个参数是起始日期,第二个是结束日期。同样,若要当天入院出院算1天,需在SUM内加1。
PostgreSQL 写法
SELECT SUM(EXTRACT(DAY FROM DischargeDate - AdmitDate)) AS TotalStayDays, EXTRACT(DAY FROM @ToDate - @FromDate) + 1 AS PeriodTotalDays FROM PatientAdmissions WHERE AdmitDate >= @FromDate AND DischargeDate <= @ToDate;
说明:PostgreSQL中直接用日期相减会得到间隔类型,用
EXTRACT(DAY FROM ...)提取天数部分即可。
场景2:住院记录跨指定时间段(部分重叠)
如果需要统计那些和指定时间段有交集的住院记录(比如患者在FromDate前入院,ToDate后出院,只计算重叠部分的时长),可以用下面的写法:
MySQL 示例
SELECT SUM( DATEDIFF( LEAST(DischargeDate, @ToDate), -- 取出院日期和ToDate的较小值 GREATEST(AdmitDate, @FromDate) -- 取入院日期和FromDate的较大值 ) + 1 -- 包含首尾日期则+1,否则去掉 ) AS TotalStayDays, DATEDIFF(@ToDate, @FromDate) + 1 AS PeriodTotalDays FROM PatientAdmissions WHERE -- 筛选出和指定时间段有交集的记录 AdmitDate <= @ToDate AND DischargeDate >= @FromDate;
关键说明
@FromDate和@ToDate是用户输入的参数,实际使用时替换成具体日期值(比如'2024-01-01')或者程序传入的参数。- 如果需要统计小时/分钟级别的时长,只需把对应的日期差函数换成对应单位即可(比如MySQL的
TIMESTAMPDIFF(HOUR, AdmitDate, DischargeDate))。
内容的提问来源于stack exchange,提问作者Shahad g
相关产品推荐
相关产品推荐

