Comptage des enregistrements entre deux dates
Pour générer un graphique multi-axes, vous avez besoin d'un nombre d'enregistrements créés pour chaque date dans un délai spécifié plage de dates.
Énoncé du problème
La tentative initiale de création d'une requête à l'aide une expression de table commune (CTE) a rencontré l'erreur « Clash de type d'opérande : datetime2 est incompatible avec int ». Cela résultait d'une inadéquation entre le type de données datetime2 utilisé pour la plage de dates et l'entier attendu pour le décalage des jours.
Solution
Pour résoudre ce problème, un décompte une table ou une fonction peut offrir de meilleures performances. Une de ces fonctions de table de pointage, créée par Itzik Ben-Gan, est présentée ici :
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 )
Sur la base de cette table de pointage, le CTE Date_Range_T peut être créé :
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 )
Ce Date_Range_T CTE fournit la plage de dates entre @StartDate et @EndDate.
Pour calculer le nombre de enregistrements pour chaque date, une requête peut être écrite comme suit :
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 requête renverra le résultat souhaité : un nombre d'enregistrements pour chaque date dans la plage de dates spécifiée.
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!