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
2023-08-24 13:14:12
<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>
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.
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.
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 à :
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.