Maison >base de données >tutoriel mysql >Comment récupérer toutes les dates dans une plage, y compris celles sans enregistrement dans MySQL ?

Comment récupérer toutes les dates dans une plage, y compris celles sans enregistrement dans MySQL ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-03 13:33:39912parcourir

How to Retrieve All Dates within a Range, Including Those with Zero Records in MySQL?

MySQL : récupérer toutes les dates d'une plage, y compris les dates vides

Dans la gestion de bases de données, visualiser la croissance de la base d'utilisateurs nécessite souvent une représentation graphique. Pour créer un tel graphique, vous pouvez disposer d'une requête qui collecte le nombre d'utilisateurs quotidiens au cours d'une plage de dates spécifique. Cependant, si certains jours manquent d’activité des utilisateurs, ces dates sont omises des résultats. Pour résoudre ce problème, explorons comment obtenir une plage de dates complète, y compris les dates sans aucun enregistrement.

Dans MySQL, la requête suivante récupère le nombre d'utilisateurs regroupés par jour dans une plage de dates spécifiée :

SELECT DATE(datecreated), count(*) AS number
FROM users
WHERE DATE(datecreated) > '2009-06-21' AND DATE(datecreated) <= DATE(NOW())
GROUP BY DATE(datecreated)
ORDER BY datecreated ASC

Bien que cette requête fournisse la plupart des informations souhaitées, elle exclut les dates avec zéro utilisateur. Pour inclure des dates vides, nous pouvons utiliser l'approche suivante :

SELECT  *
FROM (
    SELECT date_add('2003-01-01 00:00:00.000', INTERVAL n5.num*10000+n4.num*1000+n3.num*100+n2.num*10+n1.num DAY ) as date
    FROM
    (SELECT 0 AS num
        UNION ALL SELECT 1
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9) n1,
    (SELECT 0 AS num
        UNION ALL SELECT 1
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9) n2,
    (SELECT 0 AS num
        UNION ALL SELECT 1
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9) n3,
    (SELECT 0 AS num
        UNION ALL SELECT 1
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9) n4,
    (SELECT 0 AS num
        UNION ALL SELECT 1
        UNION ALL SELECT 2
        UNION ALL SELECT 3
        UNION ALL SELECT 4
        UNION ALL SELECT 5
        UNION ALL SELECT 6
        UNION ALL SELECT 7
        UNION ALL SELECT 8
        UNION ALL SELECT 9) n5
) a
WHERE date > '2011-01-02 00:00:00.000' AND date < NOW()
ORDER BY date

Avec cette requête, vous pouvez générer une séquence de dates dans une plage spécifiée et les inclure dans les résultats, même si ces dates n'ont pas de correspondance. enregistrements dans votre base de données.

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!

Déclaration:
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