计算每个月的事件数量

时间:2015-11-24 13:15:03

标签: php mysql json codeigniter

我有一张图表,我想填写每月有多少记录的信息。图表需要以这种格式接收数据:

    data: [
    ["Jan", 140],
    ["Feb", 240],
    ["Mar", 190],
    ["Apr", 140],
    ["May", 180],
    ["Jun", 320],
    ["Jul", 270],
    ["Aug", 180]
],

我需要生成每月有多少记录。我的数据库看起来像:

id |   start     |    end     |
------------------------------
1  |  2015-10-01 | 2015-10-31 |
2  |  2015-10-05 | 2015-10-09 |
3  |  2015-10-06 | 2015-10-07 |
4  |  2015-11-01 | 2015-11-02 |
5  |  2015-11-03 | 2015-11-06 |
6  |  2015-11-09 | 2015-10-13 |
7  |  2015-11-16 | 2015-10-18 |
8  |  2015-11-21 | 2015-10-29 |

因此,我们在10月份有3条记录,11月有5条记录。 我应该如何正确地初始化一个函数,该函数最终会返回一个我可以传递给数据的正确格式? 我可以获取像

这样的记录

MODEL:

   function specialtest($start, $end) {
   $q = ("SELECT count(*) as count FROM reservations WHERE end > '$start' and start < '$end'");
   $query = $this->db->query($q);
   print json_encode($query->result_array());
   exit;
}

然后在控制器中:

   $data = $this->model->specialtest($arg, $arg2);

然而,这不是我所需要的。我每个月都需要这些记录而不会调用任何函数参数,因为我不知道它们?任何想法?

2 个答案:

答案 0 :(得分:4)

只要此功能未在应用程序的其他位置使用,请将查询更新为:

$q = "SELECT DATE_FORMAT(start, '%b') as month, DATE_FORMAT(start, '%Y') as year, count(*) as count FROM reservations WHERE end > '$start' and start < '$end' GROUP BY DATE_FORMAT(start, '%b-%Y')";

请注意,您需要包含年份,以便明年您不会抓住上一年的参赛作品。

答案 1 :(得分:0)

希望它有所帮助...

function specialtest() {
$data = [];
$year = 2015;

for ($i=1; $i<=12; $i++){
    $sql = 'SELECT count(*) as count FROM reservations WHERE YEAR(start) = '.$year.' AND MONTH(start)='.$i;
    $query =  $this->$db->query($sql);
    $results = $query->result_array();
    $data[] = [date('M', strtotime($year.'-'.$i.'-01')) => $results[0]['count']];
}

echo json_encode($data);
exit(); 
}