首页 > 数据库 > mysql教程 > 如何用SQL统计指定日期范围内的每日记录?

如何用SQL统计指定日期范围内的每日记录?

Linda Hamilton
发布: 2024-12-19 11:52:13
原创
668 人浏览过

How to Count Daily Records Within a Specified Date Range in SQL?

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

在数据库系统中,经常需要根据指定日期检索数据范围。 SQL 提供了内置函数和技术来促进此任务。本文解决了计算给定日期范围内每个日期的记录数的挑战。

问题陈述

给定两个日期,目的是创建一个返回该范围内每个日期的记录数的查询。为了说明这一点,假设我们要从名为 tbl_Support_Requests 的表中检索 2020 年 11 月 1 日至 2021 年 2 月 22 日期间创建的支持请求的计数。

尝试失败

解决此问题的初步尝试涉及使用名为的通用表表达式 (CTE) Date_Range_T 用于生成指定范围内的日期的顺序列表。然而,CTE 的递归定义导致了 datetime2 和 int 之间的操作数类型冲突。

解决方案

要解决这个问题,更有效的方法是使用计数表或函数。理货表,也称为数字生成器,提供一系列连续的数字,可以作为生成一系列日期的来源。

以下是使用 Itzik Ben-Gan 的理货表函数的优化解决方案:

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
登录后复制

此解决方案生成指定范围(#StartDate# 到 #EndDate#)内的一系列日期,包括端点日期。然后,它将该范围表与 tbl_Support_Requests 表的 CreatedDate 列连接起来,过滤属于每个日期范围内的记录。最后,它按日期对结果进行分组,并计算每个日期的记录数。

以上是如何用SQL统计指定日期范围内的每日记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板