計算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中文網其他相關文章!