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

Comment compter efficacement les enregistrements dans une plage de dates spécifique en SQL ?

Patricia Arquette
Libérer: 2024-12-18 16:42:11
original
740 Les gens l'ont consulté

How to Efficiently Count Records Within a Specific Date Range in SQL?

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

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

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

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!

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