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

计算指定IT专员当年不含周末的Vacation假期天数SQL需求

统计指定IT专员当年工作日假期天数(排除周末)

需求说明

需要统计指定IT专员(id_informatyk=119)当年Vacation类型(kal_termin.id_typ=1)的假期总天数,排除周六和周日。假期分为单日(start与end日期相同)或多日(start为起始日期,end为结束日期),现有查询已实现基础天数累加,但未过滤周末,需调整计算逻辑。

修改后的SQL查询

SELECT  
    kal_uczestnik.id_informatyk, 
    SUM(
        -- 计算假期总天数(包含周末)
        DATEDIFF(kal_termin.end, kal_termin.start) + 1
        -- 减去区间内的周六数量
        - FLOOR((DATEDIFF(kal_termin.end, kal_termin.start) + WEEKDAY(kal_termin.start) + 1) / 7)
        -- 减去区间内的周日数量
        - FLOOR((DATEDIFF(kal_termin.end, kal_termin.start) + WEEKDAY(kal_termin.start)) / 7)
    ) AS work_days_off 
FROM kal_termin
JOIN kal_uczestnik ON kal_termin.id = kal_uczestnik.id_termin 
WHERE 
    kal_uczestnik.id_informatyk = 119 
    AND kal_termin.id_typ = 1 
    AND YEAR(kal_termin.start) = YEAR(CURRENT_DATE) 
GROUP BY kal_uczestnik.id_informatyk;

关键逻辑解释

  1. 总天数计算:DATEDIFF(end, start) + 1 得到假期的完整天数(包含周末),不管是单日还是多日都适用,无需额外的CASE判断。
  2. 周六数量统计:FLOOR((DATEDIFF(end, start) + WEEKDAY(start) + 1) / 7),利用WEEKDAY()函数(0=周一,6=周日),计算区间内周六的总数。
  3. 周日数量统计:FLOOR((DATEDIFF(end, start) + WEEKDAY(start)) / 7),同理统计区间内周日的总数。
  4. 工作日天数:总天数减去周六、周日的数量,得到最终排除周末的假期天数。

注意事项

  • 该查询基于MySQL语法,若使用其他数据库(如SQL Server、PostgreSQL),需替换对应的日期函数(例如WEEKDAY()在SQL Server中对应DATEPART(WEEKDAY, ...),且周末的判定逻辑可能不同)。
  • 显式JOIN语法比原查询的隐式连接更清晰,也符合现代SQL规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 14:01:27