如何在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ć
相关产品推荐
相关产品推荐

