如何修改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
逻辑说明
- 优先校验统计月份是否为2月,再匹配两种满勤条件:
- 员工入职时间不晚于2月1日,且离职时间不早于2月最后一天(或仍在职),即整月在职
- 员工2月入职,且实际出勤天数等于2月总天数(28或29天)
- 满足任一满勤条件则直接返回30,不满足则执行原有逻辑计算实际出勤天数。
内容的提问来源于stack exchange,提问作者A.N.T
相关产品推荐
相关产品推荐

