Maison > base de données > tutoriel mysql > Comment compter les enregistrements quotidiens dans une plage de dates spécifiée en SQL ?

Comment compter les enregistrements quotidiens dans une plage de dates spécifiée en SQL ?

Linda Hamilton
Libérer: 2024-12-19 11:52:13
original
684 Les gens l'ont consulté

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

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
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal