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

如何在SQL Server中统计单个月份内的星期日总数?

统计当月星期日总数的解决方案

我明白你的痛点——当前这条SQL确实只能算出当月的第一个星期日,没法直接得到整月的周日总数。我给你几个实用的方案,你可以根据自己的SQL Server版本和需求来选:

方法一:递归CTE生成日期范围统计

适合需要直观看到所有周日日期,或者版本支持递归的情况:

DECLARE @MonthStart DATE = '2019-11-01';
DECLARE @MonthEnd DATE = EOMONTH(@MonthStart);

WITH DateRange AS (
    SELECT @MonthStart AS DateVal
    UNION ALL
    SELECT DATEADD(DAY, 1, DateVal)
    FROM DateRange
    WHERE DateVal < @MonthEnd
)
SELECT COUNT(*) AS TotalSundays
FROM DateRange
WHERE DATEPART(dw, DateVal) = 1;

小提醒:DATEPART(dw, ...)的返回值和SET DATEFIRST的设置有关。默认情况下DATEFIRST是7,此时周日对应1;如果你的环境里DATEFIRST设为1,周日就对应7。你可以用SELECT @@DATEFIRST查看当前设置,或者改用DATEPART(weekday, DateVal) = DATEPART(weekday, '1900-01-07')来避免这个问题——因为1900-01-07是固定的周日,这样不管DATEFIRST怎么配置都能准确匹配。

方法二:直接计算(更高效)

如果不需要列出所有周日,只是要总数,这个方法更高效,不用生成所有日期:

DECLARE @MonthStart DATE = '2019-11-01';
DECLARE @FirstSunday DATE = DATEADD(DAY, 8 - DATEPART(dw, @MonthStart), @MonthStart);
DECLARE @MonthEnd DATE = EOMONTH(@MonthStart);

SELECT 
    CASE 
        WHEN @FirstSunday > @MonthEnd THEN 0
        ELSE DATEDIFF(DAY, @FirstSunday, @MonthEnd)/7 + 1
    END AS TotalSundays;

原理很简单:先算出当月第一个周日,如果这个日期已经超出当月最后一天,说明当月没有周日;否则用第一个周日到月末的天数差除以7,再加1(算上第一个周日本身),就是整月的周日总数。

内容的提问来源于stack exchange,提问作者Nedim Huremović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:46:38