Maison >base de données >tutoriel mysql >Comment récupérer toutes les dates dans une plage spécifiée dans MySQL, y compris les dates sans enregistrement ?
Lorsque vous travaillez avec des bases de données, il est souvent nécessaire de récupérer des données pour une période ou une plage spécifique. Toutefois, s'il n'existe aucun enregistrement pour certaines dates dans cette plage, ces dates peuvent être ignorées dans les résultats. Cela peut entraîner des lacunes dans l'analyse et la visualisation des données.
Problème :
Dans MySQL, la requête ci-dessous sélectionne les dates et les nombres correspondants dans la table des utilisateurs dans un délai donné. plage de dates :
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
Cette requête renvoie des résultats tels que :
date1 5 date2 8 date5 9
Cependant, elle ignore les dates avec zéro utilisateur, laissant des lacunes dans les données. Le résultat souhaité serait :
date1 5 date2 8 date3 0 date4 0 date5 9
Solution :
Pour récupérer toutes les dates dans la plage spécifiée, même s'il n'y a aucun enregistrement associé, nous pouvons utiliser un requête sophistiquée qui exploite les séquences de dates générées. La requête ci-dessous accomplit cela :
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
Cette requête utilise des sous-requêtes UNION ALL imbriquées pour générer une séquence de dates allant du 1er janvier 2003 à juste avant la date actuelle. La fonction date_add() est ensuite utilisée pour ajouter progressivement les dates générées à la date de début afin de créer la plage de dates souhaitée.
Remarques supplémentaires :
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!