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

SQL Server如何统计两个日期间指定星期几的出现次数

问题分析

原查询逻辑的问题是没有拆分起止日期区间内的所有自然日,仅按起止日期分组聚合,无法统计区间内每个星期二的覆盖次数。

可运行实现代码(适用于SQL Server)

核心思路是先通过递归CTE生成覆盖所有数据范围的连续日期表,再关联原业务表筛选出落在区间内的星期二,最后分组统计每个日期的覆盖次数:

WITH AllDates AS (
    -- 锚点取全表最小开始日期作为日期序列起点
    SELECT MIN(startdate) AS calendar_date
    FROM EmpDetails1
    UNION ALL
    -- 递归逐天生成日期,直到达到全表最大结束日期
    SELECT DATEADD(DAY, 1, calendar_date)
    FROM AllDates
    WHERE calendar_date < (SELECT MAX(enddate) FROM EmpDetails1)
)
SELECT
    CONVERT(VARCHAR, calendar_date, 1) AS date,
    COUNT(id) AS count
FROM AllDates
INNER JOIN EmpDetails1
    ON calendar_date BETWEEN startdate AND enddate
-- 筛选星期二,用DATEPART不受系统语言环境影响,默认设置下周二对应返回值3
WHERE DATEPART(WEEKDAY, calendar_date) = 3
GROUP BY calendar_date
ORDER BY calendar_date
-- 关闭递归深度限制,避免大日期范围报错
OPTION (MAXRECURSION 0)
注意事项
  • 如果你的SQL Server实例修改过@@DATEFIRST参数(每周第一天的设置),需要调整DATEPART(WEEKDAY, ...)对应的判断值,保证匹配星期二即可。
  • 你给出的预期输出和测试数据的实际计算结果存在差异:测试数据中2016/1/5同时落在两个区间内,计数应为2;2016/1/12、2016/1/19仅落在第二个区间内,计数应为1,可以核对下原始数据是否有遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:27:22