您可以使用 DATEDIFF() 和 DATENAME() 函数以及递归 CTE,例如
DECLARE @date1 AS DATE, @date2 AS DATE;
SET @date1 = '2020-10-01';
SET @date2 = '2020-12-31';
WITH cte AS
(
SELECT 0 AS n
UNION ALL
SELECT n + 1 AS value
FROM cte
WHERE cte.n < DATEDIFF(day,@date1,@date2)
)
SELECT DATENAME(MONTH,DATEADD(day, n, @date1 ) ) AS [Month Name], COUNT(*) AS [Count]
FROM cte
WHERE DATENAME(WEEKDAY, DATEADD(day, n, @date1 ))= 'Sunday'
GROUP BY DATENAME(MONTH,DATEADD(day, n, @date1 ))
Demo
如果日期间隔超过一年,则使用以下代码,其中也包括排序。
DECLARE @date1 AS DATE, @date2 AS DATE;
SET @date1 = '2020-10-01';
SET @date2 = '2021-03-31';
WITH cte AS
(
SELECT 0 AS n
UNION ALL
SELECT n + 1 AS value
FROM cte
WHERE cte.n < DATEDIFF(day,@date1,@date2)
)
SELECT DATEPART(yy, DATEADD(day, n, @date1)) AS [Year],
DATENAME(MONTH,DATEADD(day, n, @date1)) AS [Month Name],
COUNT(*) AS [Count]
FROM cte
WHERE DATENAME(WEEKDAY, DATEADD(day, n, @date1))= 'Sunday'
GROUP BY DATENAME(MONTH,DATEADD(day, n, @date1)),
DATEPART(yy, DATEADD(day, n, @date1)),
DATEPART(m, DATEADD(day, n, @date1))
ORDER BY [Year], DATEPART(m, DATEADD(day, n, @date1))
OPTION (MAXRECURSION 0)
Demo