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

PostgreSQL:筛选65岁以上患者的日期条件正确性及优化问询

问题解答

原查询的筛选条件是否准确?

不准确,原因有两点:

  1. 闰年导致天数计算偏差:65年的实际总天数不是固定的23741.25,因为闰年(每4年一次,整百年份除外)会额外增加1天。不同的65年周期包含的闰年数量不同,比如1958-2023年包含16个闰年,总天数为23741天;而有的周期可能包含17个闰年,总天数会更多。用固定天数筛选会导致结果偏差。
  2. 日期差的整数特性:PostgreSQL中CURRENT_DATE - p.date_of_birth返回的是整数天数,和浮点数23741.25比较时,相当于筛选天数大于23741天的患者,这会排除刚好满65岁当天的患者,不符合“65岁及以上”的需求。

更优的条件写法(无需换算天数)

推荐两种准确且可读性更高的写法:

写法一:使用AGE()函数直接判断年龄

SELECT
    AVG(surgical_discharge_date - surgical_admission_date) AS avg_stay
FROM
    hosp.surgical_encounters as e
LEFT JOIN hosp.patients as p
    ON e.master_patient_id = p.master_patient_id
WHERE
    AGE(p.date_of_birth) >= INTERVAL '65 years'

AGE(p.date_of_birth)默认以当前日期为基准计算患者年龄,自动处理闰年、月份天数差异等问题。

写法二:计算出生日期上限

SELECT
    AVG(surgical_discharge_date - surgical_admission_date) AS avg_stay
FROM
    hosp.surgical_encounters as e
LEFT JOIN hosp.patients as p
    ON e.master_patient_id = p.master_patient_id
WHERE
    p.date_of_birth <= CURRENT_DATE - INTERVAL '65 years'

直接筛选出生日期早于等于“当前日期减去65年”的患者,逻辑直观且计算准确。

额外注意点

原查询使用LEFT JOIN但在WHERE中引用了p.date_of_birth,这会自动将LEFT JOIN转为INNER JOIN(因为无匹配患者记录时p.date_of_birth为NULL,会被条件过滤)。如果需要保留无患者信息的手术记录,可调整条件为:

WHERE
    p.date_of_birth IS NULL OR p.date_of_birth <= CURRENT_DATE - INTERVAL '65 years'

内容的提问来源于stack exchange,提问作者ppp147

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:05:29