LoginSignup
4
4

More than 5 years have passed since last update.

対象月の全日付を取得する方法

Posted at

背景

レポート画面を作ろうとしていて(※1)、DBから日付ごとに集計したデータを取得した。
しかし、データのない日付は存在しない作りになっていた。

※1: 画面では対象年月を選べて、選んだ年月のデータが日別で表示される感じ

DBの取得情報そのまま表示

日付 売上件数 売上金額
2015-12-01 3 300
2015-12-04 4 400
2015-12-05 3 300
... ... ...
2015-12-30 3 300
2015-12-31 3 300

みたいな感じでデータがあるとこだけ出力される。

ほしいイメージ

日付 売上件数 売上金額
2015-12-01 3 300
2015-12-02 0 0
2015-12-03 0 0
2015-12-04 4 400
2015-12-05 3 300
... ... ...
2015-12-30 3 300
2015-12-31 3 300

売上がない日は0で出力したい。

解決策

DateIntervalを使って対象月の全日付を取得する

php
$date = '2015-12'; //本来はformからのリクエストなので動的
$begin = new DateTime(date('Y-m-d', strtotime('first day of '. $date)));
$end = new Datetime(date('Y-m-d', strtotime('first day of next month '. $date)));
$interval = new DateInterval('P1D');
$daterange = new DatePeriod($begin, $interval, $end);
foreach($daterange as $date){
    echo $date->format("Y-m-d") . "\n";
}
output
2015-12-01
2015-12-02
2015-12-03
2015-12-04
2015-12-05
2015-12-06
2015-12-07
2015-12-08
2015-12-09
2015-12-10
2015-12-11
2015-12-12
2015-12-13
2015-12-14
2015-12-15
2015-12-16
2015-12-17
2015-12-18
2015-12-19
2015-12-20
2015-12-21
2015-12-22
2015-12-23
2015-12-24
2015-12-25
2015-12-26
2015-12-27
2015-12-28
2015-12-29
2015-12-30
2015-12-31

あとはDBのデータと付き合わせて出力すれば、欲しいものは手に入る。

参考

余談

例として使ったような売上げデータの場合は注文tableと集計結果tableを分けて作って、レポートは集計結果tableを参照すべきだと思う。
今回は諸事情で注文テーブル(みたいな)tableを利用したので、こんな風な処理が必要になった。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4