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

如何修改SQL代码使2月满勤时按30个工作日统计出勤天数

问题解决:2月满勤员工按30天统计出勤天数

需求背景

现有SQL代码用于根据指定日期范围计算员工出勤天数,规则为:若员工入职日期在统计范围内,则从入职日起计算至统计结束日。现在需要新增规则:当统计月份为2月,且员工当月实际出勤满28或29天时,出勤天数按30天统计,但现有代码始终按实际天数计算,添加新WHEN语句后未解决问题。

原代码

SELECT e.IdEmpleado,e.Nombres,s.FechaInicio,s.FechaFin,s.EstadoFila, 
    CASE
    WHEN s.FechaInicio > @FechaInicio AND (s.FechaFin < @FechaFin ) then (DATEDIFF(DAY,s.FechaInicio,@FechaFin)+1)
    WHEN s.FechaInicio > @FechaInicio AND (s.FechaFin > @FechaFin ) then ((DATEDIFF(DAY,s.FechaInicio,@FechaFin)))
    WHEN s.FechaInicio <= @FechaInicio AND (s.FechaFin > @FechaFin OR s.FechaFin is null) then DATEDIFF(day, @FechaInicio, @FechaFin)+1
    --WHEN s.FechaInicio >= @FechaFin AND s.FechaInicio <  @FechaInicio  then DATEDIFF(DAY,@FechaFin,s.FechaInicio)

    ELSE 0
    END AS DiasTrabajados
FROM contratacion.Contrato s
INNER JOIN contratacion.Empleados e ON s.IdEmpleado = e.IdEmpleado
WHERE s.EstadoFila = 1

解决方案

核心思路是在原有CASE判断最前方,优先处理统计月份为2月且员工当月满勤的场景,直接返回30。这里的满勤分为两种情况:员工整月覆盖2月在职,或是2月入职且当月全勤。

修改后的代码如下:

SELECT e.IdEmpleado,e.Nombres,s.FechaInicio,s.FechaFin,s.EstadoFila, 
    CASE
    -- 新增:判断2月满勤场景,直接返回30
    WHEN MONTH(@FechaInicio) = 2 
         AND (
             -- 场景1:员工整月覆盖2月在职(入职≤2月1日,离职≥2月最后一天或未离职)
             (s.FechaInicio <= DATEFROMPARTS(YEAR(@FechaInicio), 2, 1) 
              AND (s.FechaFin >= EOMONTH(@FechaInicio) OR s.FechaFin IS NULL))
             -- 场景2:2月入职,且从入职到月末/离职日的出勤天数等于当月总天数
             OR (MONTH(s.FechaInicio) = 2 
                 AND YEAR(s.FechaInicio) = YEAR(@FechaInicio)
                 AND DATEDIFF(DAY, s.FechaInicio, ISNULL(s.FechaFin, EOMONTH(@FechaInicio))) + 1 = DAY(EOMONTH(@FechaInicio)))
         )
    THEN 30
    -- 保留原有出勤计算逻辑
    WHEN s.FechaInicio > @FechaInicio AND (s.FechaFin < @FechaFin ) then (DATEDIFF(DAY,s.FechaInicio,@FechaFin)+1)
    WHEN s.FechaInicio > @FechaInicio AND (s.FechaFin > @FechaFin ) then ((DATEDIFF(DAY,s.FechaInicio,@FechaFin)))
    WHEN s.FechaInicio <= @FechaInicio AND (s.FechaFin > @FechaFin OR s.FechaFin is null) then DATEDIFF(day, @FechaInicio, @FechaFin)+1
    ELSE 0
    END AS DiasTrabajados
FROM contratacion.Contrato s
INNER JOIN contratacion.Empleados e ON s.IdEmpleado = e.IdEmpleado
WHERE s.EstadoFila = 1

逻辑说明

  1. 优先校验统计月份是否为2月,再匹配两种满勤条件:
    • 员工入职时间不晚于2月1日,且离职时间不早于2月最后一天(或仍在职),即整月在职
    • 员工2月入职,且实际出勤天数等于2月总天数(28或29天)
  2. 满足任一满勤条件则直接返回30,不满足则执行原有逻辑计算实际出勤天数。

内容的提问来源于stack exchange,提问作者A.N.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:05:37