【问题标题】:How to get total weekend days counts grouped by month for a given month range in SQL Server? [duplicate]如何在 SQL Server 中获取给定月份范围内按月份分组的周末总天数? [复制]
【发布时间】:2021-04-08 06:21:45
【问题描述】:

如何在 SQL Server 中获取给定月份范围内按月份分组的周末(星期日)总数?

例如:所选日期:“2020 年 10 月”至“2020 年 12 月”

Month Name Count
October 4
November 4
December 5

【问题讨论】:

  • 更多细节。你的表是什么,到目前为止你尝试过什么查询?
  • 我会使用Calendar table 来获得此类查询的答案。如果你的数据库中有一个 Calendar 表,那么它就变成了一个简单的查询。
  • @Charlieface,没有表格,我只需要基于日期范围的计数

标签: sql sql-server date tsql datetime


【解决方案1】:

您可以使用 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

【讨论】:

  • 对于这种事情,递归 cte 真的很慢。改用计数表或日历表,或使用 Itzik Ben-Gan 的计数功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 1970-01-01
  • 2014-11-21
相关资源
最近更新 更多