首頁 > 資料庫 > mysql教程 > 如何用SQL統計指定日期範圍內的每日記錄?

如何用SQL統計指定日期範圍內的每日記錄?

Linda Hamilton
發布: 2024-12-19 11:52:13
原創
686 人瀏覽過

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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板