Calculer le nombre d'enregistrements pour chaque date entre 2 dates
Dans les systèmes de bases de données, il est souvent nécessaire de récupérer des données en fonction d'une date spécifiée gamme. SQL fournit des fonctions et des techniques intégrées pour faciliter cette tâche. Cet article aborde le défi du calcul du nombre d'enregistrements pour chaque date dans une plage de dates donnée.
Énoncé du problème
Étant donné deux dates, l'intention est de créer un requête qui renvoie le nombre d'enregistrements pour chaque date dans cette plage. Pour illustrer, supposons que nous souhaitions récupérer le nombre de demandes d'assistance créées entre le 1er novembre 2020 et le 22 février 2021, à partir d'une table nommée tbl_Support_Requests.
Tentative échouée
Une première tentative pour résoudre ce problème impliquait l'utilisation d'une expression de table commune (CTE) appelée Date_Range_T pour générer une liste séquentielle de dates dans la plage spécifiée. Cependant, la définition récursive du CTE a entraîné un conflit de types d'opérandes entre datetime2 et int.
Solution
Pour surmonter ce problème, une approche plus efficace consiste à utiliser un pointage table ou fonction. Les tables de pointage, également connues sous le nom de générateurs de nombres, fournissent une série de nombres séquentiels qui peuvent servir de source pour générer une plage de dates.
Ce qui suit est une solution optimisée utilisant la fonction de table de pointage d'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
Cette solution génère une plage de dates dans la plage spécifiée (#StartDate# à #EndDate#), y compris les dates de fin. Il joint ensuite cette table de plage à la table tbl_Support_Requests sur la colonne CreatedDate, en filtrant les enregistrements qui se situent dans chaque plage de dates. Enfin, il regroupe les résultats par date et compte le nombre d'enregistrements pour chaque date.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!