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

如何通过SQL统计医生月度出诊天数(单日多预约计1天)

嘿,这个需求其实挺常见的,核心就是统计医生有预约的唯一日期数量——不管当天有多少个预约,都只算1天。我给你几个实用的SQL方案,适配不同场景:

基础方案:统计有预约记录的医生出诊天数

假设你的预约表叫appointments,包含doctor_id(医生ID)和appointment_date(预约日期,可能是带时分秒的DATETIME类型)。下面的SQL适用于大多数数据库(MySQL、PostgreSQL、SQL Server等):

SELECT 
    doctor_id,
    COUNT(DISTINCT DATE(appointment_date)) AS monthly_working_days
FROM 
    appointments
WHERE 
    -- 筛选2024年12月的数据,年份可根据需求调整
    EXTRACT(YEAR FROM appointment_date) = 2024
    AND EXTRACT(MONTH FROM appointment_date) = 12
GROUP BY 
    doctor_id;

关键逻辑说明:

  • DATE(appointment_date):如果你的预约日期带时分秒,一定要用这个函数转成纯日期,不然同一天不同时间的预约会被当成不同条目,导致计数错误。
  • COUNT(DISTINCT ...):对去重后的日期计数,完美实现“当天不管多少预约都算1天”的需求。
进阶方案:包含所有医生(即使当月无预约)

如果需要把所有医生都列出来,哪怕他们12月没有任何预约(显示出诊天数为0),可以左连接医生表(假设医生表叫doctors,主键doctor_id):

SELECT 
    d.doctor_id,
    -- 用COALESCE把NULL转成0,无预约的医生就显示0天
    COALESCE(COUNT(DISTINCT DATE(a.appointment_date)), 0) AS monthly_working_days
FROM 
    doctors d
LEFT JOIN 
    appointments a 
    ON d.doctor_id = a.doctor_id
    -- 把日期筛选条件放在JOIN里,避免左连接变成内连接
    AND EXTRACT(YEAR FROM a.appointment_date) = 2024
    AND EXTRACT(MONTH FROM a.appointment_date) = 12
GROUP BY 
    d.doctor_id;
数据库专属简化写法

不同数据库有更简洁的日期函数,比如:

  • MySQL可以直接用YEAR()和MONTH():
    WHERE YEAR(appointment_date) = 2024 AND MONTH(appointment_date) = 12
    
  • SQL Server用DATEPART():
    WHERE DATEPART(YEAR, appointment_date) = 2024 AND DATEPART(MONTH, appointment_date) = 12
    

小提醒:

如果需要动态统计当前年度的12月,可以把固定年份换成YEAR(CURRENT_DATE)(MySQL/PostgreSQL)或者DATEPART(YEAR, GETDATE())(SQL Server),这样不用每年修改SQL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:20:37