うための最も簡単な方法はパッドは空の日のアプリケーション結果はmysqlまたはperl末)?

StackOverflow https://stackoverflow.com/questions/75752

  •  09-06-2019
  •  | 
  •  

質問

私はビルに迅速csvからのmysqlのテーブル、クエリのように:

select DATE(date),count(date) from table group by DATE(date) order by date asc;

でダンプしてファイルをperl間:

while(my($date,$sum) = $sth->fetchrow) {
    print CSV "$date,$sum\n"
}

ある日のギャップのデータは:

| 2008-08-05 |           4 | 
| 2008-08-07 |          23 | 

たいと思いパッドにデータを埋める日がゼロのカウント応募終わる:

| 2008-08-05 |           4 | 
| 2008-08-06 |           0 | 
| 2008-08-07 |          23 | 

I slappedと感(とほぼ確実にバギー)回避策としての日当たりの月の一部の数がされていると思いますが、より直接れたドキュメント、またはmysqlまたはperlです。

他の天才的なアイデア/叩のためのなぜってamにそのようなダム?


もっと保存の手順で温度テーブルは、日付範囲かの理由:

  • ピックアップしました。日付の範囲んですか毎回
  • サーバーに問題がなかった私できるperlモジュールをインストールに関atmの状態では老朽化したのに十分でなかったもの遠隔日本-yに設置

Perl日付/日時-繰り返し処理の回答も非常に良い、私は希望していますが、複数回答!

役に立ちましたか?

解決

だけのようなサーバ側では、通常の作成テーブルを含む全ての日の両時点、left joinこのテーブルのクエリ。のようなこと:

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

この場合にはしたほうが良いと思われますぎるチェックのクライアント側の場合、現在の日付ではないprevios+1、一部のほかの文字列です。

他のヒント

った時、この問題への記入不足の日私は実際に作成された参照テーブルが含まれるすべての日に興味がある私にとってのデータにテーブルです。この原ていく。

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;

として出力くださりを使用 INTO OUTFILEを選択 く生成、CSV。いってしまったの悩みと特殊文字のエスケープします。

しないダムなものMySQLは、挿入し、空の日付値です。これはperlと二段階です。第一に、負荷の全てのデータからの照会へのハッシュが主催する日です。次に、作成日::EzDateオブジェクトを増やすということで、...

my $current_date = Date::EzDate->new();
$current_date->{'default'} = '{YEAR}-{MONTH NUMBER BASE 1}-{DAY OF MONTH}';
while ($current_date <= $final_date)
{
    print "$current_date\t|\t%hash_o_data{$current_date}";  # EzDate provides for     automatic stringification in the format specfied in 'default'
    $current_date++;
}

最終日はEzDateオブジェクトを含む文字列の終了の日付範囲から選びます。

EzDateなるというCPANができるのではないでしょうかようになperlモが日付を比較し、日incrementor.

を使用してくださ DateTime オブジェクト:

use DateTime;
my $dt;

while ( my ($date, $sum) = $sth->fetchrow )  {
    if (defined $dt) {
        print CSV $dt->ymd . ",0\n" while $dt->add(days => 1)->ymd lt $date;
    }
    else {
        my ($y, $m, $d) = split /-/, $date;
        $dt = DateTime->new(year => $y, month => $m, day => $d);
    }
    print CSV, "$date,$sum\n";
}

うに上記のコードなので最終印刷日時に保存され DateTime オブジェクト $dt, が現在の日付より一日 にこの目で確かめることができる単位 $dt 一日(ドリーで、ライン CSV)までと同様に、現在の日付です。

このように必要な追加テーブル、および必要のない取得した全ての 行する。

思い出ついてご覧いただけます。

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

select n3.num*100+n2.num*10+n1.num as date

を取得しますカラム番号は0から最大n3*100+max(n2)*10+max(n1)

以来、このmax n3として3つの選択に戻りま399、0->400記録の写真をカレンダー).

で調整することができパロアルトネットワークカレンダーによる制限でしっかり果たしていきたいと考えmin(日)まで().

まんがその隙間になりたい全ての値と思われる)から初日をリストかさも調理もこれ一台で、次のように:

use DateTime;
use DateTime::Format::Strptime;
my @row = $sth->fetchrow;
my $countdate = strptime("%Y-%m-%d", $firstrow[0]);
my $thisdate = strptime("%Y-%m-%d", $firstrow[0]);

while ($countdate) {
  # keep looping countdate until it hits the next db row date
  if(DateTime->compare($countdate, $thisdate) == -1) {
    # counter not reached next date yet
    print CSV $countdate->ymd . ",0\n";
    $countdate = $countdate->add( days => 1 );
    $next;
  }

  # countdate is equal to next row's date, so print that instead
  print CSV $thisdate->ymd . ",$row[1]\n";

  # increase both
  @row = $sth->fetchrow;
  $thisdate = strptime("%Y-%m-%d", $firstrow[0]);
  $countdate = $countdate->add( days => 1 );
}

うーん、それ以上に複雑なのかなと思っている..あなたにとってどんな年でしたが最高。

と思い、最も単純な一般に解決すべきことを Ordinal テーブルの列にする必要のある自分の場合31日*3=93).

CREATE TABLE IF NOT EXISTS `Ordinal` (
  `n` int(10) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (`n`)
);
INSERT INTO `Ordinal` (`n`)
VALUES (NULL), (NULL), (NULL); #etc

次に、い LEFT JOIN から Ordinal お使いのデータです。こちらは簡単な場合、毎日の最終週:

SELECT CURDATE() - INTERVAL `n` DAY AS `day`
FROM `Ordinal` WHERE `n` <= 7
ORDER BY `n` ASC

の二つのことばの変更が必要約この点の間隔で出ています。利用してい SET @var = 'value' 構文の機能再構成に成功しました。.

SET @end = CURDATE() - INTERVAL DAY(CURDATE()) DAY;
SET @begin = @end - INTERVAL 3 MONTH;
SET @period = DATEDIFF(@end, @begin);

SELECT @begin + INTERVAL (`n` + 1) DAY AS `date`
FROM `Ordinal` WHERE `n` < @period
ORDER BY `n` ASC;

その最終コードのように、この場合は参加の件数を取得しますメッセージ/日のヶ月間:

SELECT COUNT(`msg`.`id`) AS `message_count`, `ord`.`date` FROM (
    SELECT ((CURDATE() - INTERVAL DAY(CURDATE()) DAY) - INTERVAL 3 MONTH) + INTERVAL (`n` + 1) DAY AS `date`
    FROM `Ordinal`
    WHERE `n` < (DATEDIFF((CURDATE() - INTERVAL DAY(CURDATE()) DAY), ((CURDATE() - INTERVAL DAY(CURDATE()) DAY) - INTERVAL 3 MONTH)))
    ORDER BY `n` ASC
) AS `ord`
LEFT JOIN `Message` AS `msg`
  ON `ord`.`date` = `msg`.`date`
GROUP BY `ord`.`date`

ヒントやコメント:

  • その一検索した数決定の日時に使用する制限 Ordinal.に比較して、変換する整数型配列への日がはっきりしています。
  • 利用できる Ordinal すべての連続シーケンスです。だが含まれることを確認しより多くの行以外で最も長いシーケンスです。
  • 安く設定されていますのでお問合せ Ordinal 複数の配列、例えば、上場日(1-5)のセブン(1-7)。
  • すでに格納する日にお Ordinal テーブルですが、将来的にご検討されている柔軟性があります。このようにする必要がある一 Ordinal テーブル、どんなに多く使用します。いずれにしても、今回の速度であり、 INSERT INTO ... SELECT 構文です。

ご利用Perlモジュールな日に、計算のようにお勧めのDateTimeの持つ時間::作品の中核から5.10).だけ増分日印刷日0までにマッチします。

わからない場合はこの作品は、作成した場合新しいテーブルを含む全ての日でも問題はこのアイデアの場合の日には、今後どこへ向かおうとしているunpredictably...)およびそのleft joinのテーブル?うことなんでしょうけれど夢中から向き合えば必ず解決法があり膨大な数の可能な日程、またはnoを予測する最初と最後の日、その日のいずれかの固定は容易で、そしてこれるようになる。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top