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 ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-12-13 18:39:10577parcourir

How to Retrieve All Dates Within a Specified Range in MySQL, Including Dates with No Records?

MySQL : Récupérer toutes les dates dans une plage spécifiée, même sans aucun 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 :

  • Ajuster les valeurs '2011-01-02 00:00:00.000' et NOW() pour spécifier le début et la fin souhaités de la date plage.
  • Si des enregistrements existent en dehors de la plage de dates spécifiée dans la requête, ils seront toujours inclus dans les résultats.
  • Cette solution ne dépend pas de la structure de la table ni de la présence d'enregistrements. dans le tableau des utilisateurs. Il génère une séquence complète de dates dans la plage spécifiée et joint les résultats aux données du tableau, le cas échéant.

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