sql - 计算2个日期之间每个日期的记录数

标签 sql sql-server t-sql date-range

我必须创建一个查询来返回多轴图表的结果。我需要计算为 2 个日期之间的每个日期创建的 Id 数量。我试过这个:

 DECLARE @StartDate datetime2(7) = '11/1/2020',
         @EndDate datetime2(7) = '2/22/2021'

 ;WITH Date_Range_T(d_range) AS 
     (
       SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @EndDate) - @StartDate, 0) 
       UNION ALL SELECT DATEADD(DAY, 1, d_range) 
       FROM Date_Range_T 
       WHERE DATEADD(DAY, 1, d_range) < @EndDate
     )

  SELECT d_range, COUNT(Id) as Total 
  FROM Date_Range_T 
       LEFT JOIN [tbl_Support_Requests] on ([tbl_Support_Requests].CreatedDate Between @StartDate AND @EndDate) 
  GROUP BY d_range ORDER BY d_range ASC

当然,问题出在返回错误的 ;WITH

Operand type clash: datetime2 is incompatible with int.

如果我给它一个从当前日期算起的特定天数,上面的方法就有效,例如:

 ;WITH Date_Range_T(d_range) AS 
 (
   SELECT DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) - 6, 0) 
   UNION ALL SELECT DATEADD(DAY, 1, d_range) 
   FROM Date_Range_T 
   WHERE DATEADD(DAY, 1, d_range) < GETDATE()
 )

返回结果:

enter image description here

问题是我不知道如何替换日期范围。

最佳答案

改进 Dale K's answer ,我建议您使用计数表或函数,因为这通常性能更高。

我用过 Itzik Ben-Gan 的 well-known one如下:

DECLARE @StartDate date = '2020-11-01', @EndDate date = '2021-02-22';

  WITH
    L0 AS ( SELECT 1 AS c 
            FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),
                        (1),(1),(1),(1),(1),(1),(1),(1)) AS D(c) ),
    L1 AS ( SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B ),
    L2 AS ( SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B ),
    Nums AS ( SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS rownum
              FROM L2 )
    Date_Range_T (d_range) AS (
      SELECT TOP(DATEDIFF(day, @StartDate, @EndDate) + 1)
          DATEADD(day, rownum - 1, @StartDate) AS d_range,
          DATEADD(day, rownum, @StartDate) AS d_rangeNext
      FROM Nums
    )
SELECT d_range, COUNT(Id) AS Total 
FROM Date_Range_T 
LEFT JOIN tbl_Support_Requests R
    ON R.CreatedDate >= T.d_range AND R.CreatedDate < T.d_rangeNext
GROUP BY d_range
ORDER BY d_range ASC

关于sql - 计算2个日期之间每个日期的记录数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66324479/

相关文章:

sql - 拥有带有标志值的唯一记录

sql-server - SQL Server : preventing dirty reads in a stored procedure

sql-server - 批量插入时保留行顺序

sql - 棘手的 SQL - 选择不相邻的数字

sql-server - 塔布利克斯 : Repeat header rows on each page not working - Report Builder 3. 0

mysql - 如何在 MySQLi 查询中使用此子查询属性?

sql-server - 将函数与 OUTER APPLY 一起使用时,返回值而不是 NULL

t-sql - 提取 SQL Server 查询中字符串的第一个单词

sql - 如何从参数中选择top x?

SQL Server 存储过程 - If Count() 语句