Comment remplir des dates vides dans les résultats SQL, que ce soit du côté MySQL ou Perl, et quelle est la manière la plus simple ?
P粉448346289
P粉448346289 2023-08-24 13:14:12
0
2
532
<p>Je construis un fichier CSV rapide à partir d'une table MySQL en utilisant une requête telle que : </p> <pre class="brush:php;toolbar:false;">sélectionnez DATE(date),count(date) dans le groupe de tables par DATE(date) ordre par date asc;</pre> <p>Puis déposez-les directement dans un fichier en perl : </p> <pre class="brush:php;toolbar:false;">while(my($date,$sum) = $sth->fetchrow) { imprimer CSV "$date,$somme" }</pré> <p>Cependant, il existe des écarts de dates dans les données : </p> <pre class="brush:php;toolbar:false;">| 2008-08-05 4 | | 2008-08-07 | 23 |</pré> <p>Je souhaite compléter les données, en remplissant les dates manquantes avec des entrées de zéro, et obtenir : </p> <pre class="brush:php;toolbar:false;">| 2008-08-05 4 | 2008-08-06 | | 2008-08-07 | 23 |</pré> <p>J'ai concocté une solution de contournement très maladroite (presque certainement boguée) en utilisant un tableau de jours dans le mois et quelques calculs, mais il existe certainement une méthode plus directe, soit en MySQL, soit en Perl. </p> <p>Des idées/suggestions géniales expliquant pourquoi je suis si stupide ? </p> <heure /> <p>Au final, j'ai choisi d'utiliser une procédure stockée pour générer une table temporaire afin de gérer la plage de dates requise, pour plusieurs raisons : </p> <ul> <li>Je connais la plage de dates à rechercher à chaque fois</li> <li>Malheureusement, ce serveur ne peut actuellement pas installer de modules Perl, et il est dans un si mauvais état qu'il n'a rien de tel que Date::-y installé</li> </ul> <p>L'itération date/heure dans la réponse Perl est également très bonne, j'aimerais pouvoir sélectionner plusieurs réponses ! </p>
P粉448346289
P粉448346289

répondre à tous(2)
P粉733166744

Lorsque j'ai dû traiter ce problème, afin de renseigner les dates manquantes, j'ai en fait créé une table de référence contenant uniquement toutes les dates qui m'intéressaient et joint les tables de données sur les champs de dates. C'est brut et brut, mais ça marche.

SELECT DATE(r.date),count(d.date) 
FROM dates AS r 
LEFT JOIN table AS d ON d.date = r.date 
GROUP BY DATE(r.date) 
ORDER BY r.date ASC;

En ce qui concerne la sortie, j'utiliserais SELECT INTO OUTFILE au lieu de générer manuellement le CSV. De cette façon, nous n'avons pas à nous soucier d'échapper aux caractères spéciaux.

P粉593649715

Lorsque vous avez besoin de quelque chose comme ça côté serveur, vous créez généralement une table contenant toutes les dates possibles entre deux moments, puis vous joignez cette table avec les résultats de la requête. Similaire à :

create procedure sp1(d1 date, d2 date)
  declare d datetime;

  create temporary table foo (d date not null);

  set d = d1
  while d <= d2 do
    insert into foo (d) values (d)
    set d = date_add(d, interval 1 day)
  end while

  select foo.d, count(date)
  from foo left join table on foo.d = table.date
  group by foo.d order by foo.d asc;

  drop temporary table foo;
end procedure

Dans ce cas précis, il serait préférable de faire quelques vérifications côté client et d'ajouter une chaîne supplémentaire si la date du jour n'est pas le lendemain du jour précédent.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal