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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:45:04