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

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:SS
  • WHERE子句:过滤掉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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:25:21