Ich erstelle eine schnelle CSV-Datei aus einer MySQL-Tabelle mit einer Abfrage wie:
select DATE(date),count(date) from table group by DATE(date) order by date asc;
Speichern Sie sie dann direkt in einer Datei in Perl:
while(my($date,$sum) = $sth->fetchrow) { CSV „$date,$sumn“ drucken }
Allerdings gibt es Datumslücken in den Daten:
| 2008-08-05 | |. 2008-08-07 |. 23 |
Ich möchte die Daten auffüllen, fehlende Daten mit Null-Zählungseinträgen ergänzen und am Ende Folgendes erhalten:
| 2008-08-05 | |. 06.08.2008 | |. 2008-08-07 |. 23 |
Ich habe einen sehr umständlichen (mit ziemlicher Sicherheit fehlerhaften) Workaround zusammengeschustert, indem ich eine Reihe von Tagen im Monat und etwas Mathematik verwendet habe, aber es gibt definitiv einen direkteren Weg, entweder in MySQL oder Perl.
Irgendwelche genialen Ideen/Vorschläge, warum ich so dumm bin?
Am Ende habe ich mich aus mehreren Gründen für die Verwendung einer gespeicherten Prozedur zum Generieren einer temporären Tabelle zur Verarbeitung des erforderlichen Datumsbereichs entschieden:
Die Datums-/Uhrzeititeration in der Perl-Antwort ist auch sehr gut, ich wünschte, ich könnte mehrere Antworten auswählen!
当我需要处理这个问题时,为了填补缺失的日期,我实际上创建了一个参考表,只包含我感兴趣的所有日期,并在日期字段上将数据表连接起来。这很简单粗暴,但它有效。
至于输出,我会使用SELECT INTO OUTFILE而不是手动生成CSV。这样我们就不必担心转义特殊字符的问题。
当您在服务器端需要类似的东西时,通常会创建一个包含两个时间点之间所有可能日期的表,然后将此表与查询结果进行左连接。类似于以下内容:
在这种特定情况下,最好在客户端进行一些检查,如果当前日期不是前一天的后一天,则添加一些附加字符串。