MySQL - 填写缺少的日期

时间:2016-04-04 11:59:42

标签: php mysql charts

我有这个查询,我想用一些值填充缺少的日期(例如零......)

SELECT date, SUM(val1) as sum_val  
FROM table1  
WHERE date BETWEEN '2016-03-04' AND '2016-03-10'  
GROUP BY date

结果如下:

|--------------------------  
|date, sum_val  
|--------------------------  
|2016-03-04, 21568  
|--------------------------  
|2016-03-05, 14789  
|--------------------------  
|2016-03-08, 20568  
|--------------------------  
|2016-03-10, 5841  
|--------------------------

如何使用零值填充缺少的日期?有没有人有想法?

我需要图表预览的这些数据。

3 个答案:

答案 0 :(得分:4)

你可以尝试这个PHP循环:

$date1 = Your_first_date_value;
$date2 = Your_limit_date;
for ($d1 = $date1; d1<=$date2; strtotime("+1 day", strtotime($d1))) {
    //Fill in values
}

strtotime("+1 day", strtotime($date1))会将$date1的当前值增加1天,直至等于$date2

当一个日期没有值时,它将为零,如果日期存在,它将根据MySQL结果得到总和。

答案 1 :(得分:1)

通常,您可以使用以下命令在MySQL中生成一系列N个整数:

    select (@i:=@i+1)-1 as `myval` from someTable,(SELECT @i:=0) gen_sub limit N

请注意,您加入的表格(someTable)必须至少包含N行。上面的-1是使其为零 - 删除它并且您已经N = 3得到1,2,3。

您可以将这些整数提供给DATE_ADD函数,将其转换为一系列日期。为了便于理解,请在日期中使用一些用户变量。

SET @date_min = '2016-03-04';
SET @date_max = '2016-03-10';

select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
from information_schema.columns,(SELECT @i:=0) gen_sub
where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max

这将返回那些日子和他们之间每天的行。现在只是加入你的桌子的问题......我没有尝试过,因为我没有你的数据库结构,但下面的内容应该有效:

SET @date_min = '2016-03-04';
SET @date_max = '2016-03-10';

SELECT
   date_generator.date,
   ifnull(SUM(val1),0) as sum_val
from (
   select DATE_ADD(@date_min, INTERVAL (@i:=@i+1)-1 DAY) as `date`
   from information_schema.columns,(SELECT @i:=0) gen_sub 
   where DATE_ADD(@date_min,INTERVAL @i DAY) BETWEEN @date_min AND @date_max
) date_generator
left join table1 on table1.date = date_generator.date
GROUP BY date;

答案 2 :(得分:0)

使用下面与您的查询类似的代码,确实可以帮助您。

$query = "SELECT date, SUM(val1) as sum_val  
FROM table1  
WHERE date BETWEEN '2016-03-04' AND '2016-03-10'  
GROUP BY date";
$result = mysql_db_query($db,$query);
$dateArray = Array();
foreach($result as $row)
{
    $dateArray[] = strtotime($row['date']);
}


$from = "1-4-2016";
$to = "30-4-2016";
$datediff = strtotime($from) - strtotime($to);
$days = floor($datediff/(60*60*24));
for ($d1 = 1; $d1<$days; $d1++) {
    $cdate = strtotime("+".$d1." day", strtotime($from));
    if(!in_array($cdate, $dateArray))
    {
        // Insert record with zero
    }
}
相关问题