Oracle中如何计算患者入院到出院时长并忽略空时间行
Oracle SQL计算患者在院时长方案
要计算患者从arrived到discharged的在院时长,同时忽略created_on为null的行,这里给你两种实用的实现方法:
方法一:条件聚合(推荐,简洁高效)
利用条件聚合直接提取每个患者的入院和出院时间,再计算时间差并格式化输出:
SELECT patient_id, TO_CHAR( NUMTODSINTERVAL( MAX(CASE WHEN status = 'discharged' THEN created_on END) - MAX(CASE WHEN status = 'arrived' THEN created_on END), 'DAY' ), 'HH24:MI:SS' ) AS timeSpent FROM patient_tracking WHERE created_on IS NOT NULL AND status IN ('arrived', 'discharged') GROUP BY patient_id -- 可选:过滤掉没有同时存在arrived和discharged记录的患者 HAVING MAX(CASE WHEN status = 'arrived' THEN created_on END) IS NOT NULL AND MAX(CASE WHEN status = 'discharged' THEN created_on END) IS NOT NULL;
代码说明:
MAX(CASE WHEN...):分别筛选出每个患者的入院(arrived)和出院(discharged)时间,用MAX是确保每个患者只取一条有效记录(若有重复状态记录,取最新的)NUMTODSINTERVAL(..., 'DAY'):将时间差转换为天间隔类型,方便用TO_CHAR格式化为HH24:MI:SSWHERE子句:过滤掉created_on为空的行,同时只保留需要的两种状态HAVING子句:确保只输出同时有入院和出院记录的患者,避免出现空的时间差结果
方法二:自连接匹配
通过自连接将同一个患者的入院和出院记录关联起来,再计算时间差:
SELECT a.patient_id, TO_CHAR( d.created_on - a.created_on, 'HH24:MI:SS' ) AS timeSpent FROM patient_tracking a JOIN patient_tracking d ON a.patient_id = d.patient_id WHERE a.status = 'arrived' AND d.status = 'discharged' AND a.created_on IS NOT NULL AND d.created_on IS NOT NULL;
注意事项:
如果同一个患者存在多条arrived或discharged记录,自连接会产生笛卡尔积,需要额外处理(比如取最早的入院时间、最晚的出院时间),这时候方法一的条件聚合会更稳妥。
用示例数据测试的话,两种方法都能得到你想要的结果:
patient_id | timeSpent 7654 | 48:19:13
内容的提问来源于stack exchange,提问作者Inod Umayanga
相关产品推荐
相关产品推荐

