SQL Server计算月度工作日 实现周末复用周五工作日编号问题求助
问题原因
你原来的查询仅对修正后的周内天数排序,每周的周内修正值固定为1-5循环,因此DENSE_RANK会每周重置编号,没有按日期的整体顺序累加计数,不符合跨周累计的需求。
可行解决方案
直接使用如下SQL语句即可实现需求:
SELECT Dates, DENSE_RANK() OVER ( -- 按年月分区,实现每月编号自动重置 PARTITION BY DATEFROMPARTS(YEAR(Dates), MONTH(Dates), 1) ORDER BY CASE -- 周六/周日统一匹配当周周五的日期参与排序 WHEN DATEPART(WEEKDAY, Dates) IN (1,7) THEN DATEADD(day, 5 - ((DATEPART(WEEKDAY, Dates) + @@DATEFIRST - 2) % 7, Dates) -- 工作日直接用自身日期排序 ELSE Dates END ASC ) AS WorkingDays, DATENAME(dw,Dates) as DaysName FROM #Calendar ORDER BY Dates
逻辑说明
PARTITION BY DATEFROMPARTS(YEAR(Dates), MONTH(Dates), 1)实现每个月的编号独立计算,满足月度重置要求- 周六、周日的日期会自动修正为对应当周周五的日期,和周五对应同一个排序值
DENSE_RANK按修正后的日期升序排序,自动生成连续不重复的编号,完全符合要求的编号规则:周一到周五编号逐天+1,周六周日沿用周五编号,下周一编号在上周周五编号基础上+1((DATEPART(WEEKDAY, Dates) + @@DATEFIRST - 2) % 7 适配不同DATEFIRST`设置的环境,避免SQL实例配置差异导致的计算错误- 测试你提供的2021年11月数据,最终最大
WorkingDays值为22,和预期工作日数量完全一致。
内容的提问来源于stack exchange,提问作者JonWay
相关产品推荐
相关产品推荐

