次のようなクエリを使用して、mysql テーブルから簡単な CSV を作成しています。
select DATE(date),count(date) by DATE(date) order by date asc;
次に、それらを Perl のファイルに直接ダンプします。
while(my($date,$sum) = $sth->fetchrow) { CSV「$date,$sumn」を出力 }
ただし、データには日付のギャップがあります:
| 2008-08-05 | 4 | | 2008-08-07 | 23 |
欠落している日付をゼロカウントのエントリで埋めてデータを埋め込み、最終的に次のようにしたいと考えています。
| 2008-08-05 | 4 | | 2008-08-06 | 0 | | 2008-08-07 | 23 |
私は、月の日付の配列といくつかの数学を使用して、非常に不器用な (ほぼ確実にバグが多い) 回避策をまとめましたが、mysql または perl には、より直接的な方法があることは間違いありません。
なぜ私がそんなに愚かなのかについての天才的なアイデア/提案はありますか?
最終的に、いくつかの理由から、ストアド プロシージャを使用して、必要な日付範囲を処理する一時テーブルを生成することにしました。
Perl の回答での日付/時刻の反復も非常に優れています。複数の回答を選択できればいいのにと思います。
この問題に対処する必要があり、欠落している日付を埋める必要があるとき、私は実際に、関心のあるすべての日付だけを含む参照テーブルを作成し、日付フィールドのデータ テーブルを結合しました。粗雑で粗雑ですが、機能します。
リーリー出力に関しては、CSV を手動で生成する代わりに、SELECT INTO OUTFILEを使用します。こうすることで、特殊文字のエスケープについて心配する必要がなくなります。
サーバー側で同様のことが必要な場合は、通常、2 つの時点の間のすべての可能な日付を含むテーブルを作成し、クエリ結果を使用してこのテーブルに左結合を実行します。次のようなもの:
リーリーこの特定のケースでは、クライアント側で何らかのチェックを行い、現在の日付が前日の翌日でない場合は文字列を追加した方がよいでしょう。