2016-04-04 92 views
1

我有這個疑問,我想,以填補某些值丟失的日期(例如零...)MySQL的 - 填寫缺少的日期

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 
|-------------------------- 

哪有我用零值填充丟失的日期?有沒有人有想法?

我需要此數據爲圖表預覽。

+1

你需要使用一個額外的表用日曆或程序製作臨時表的日期範圍爲 – splash58

+0

有沒有其他方法可以做到這一點? –

+0

只是循環一個月,並作出條件,如果它的匹配與你的存在日期,那麼不需要插入數據,而是再加上0. – RJParikh

回答

1

一般情況下,你使用可以產生在MySQL一系列的N個整數:

select (@i:[email protected]+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:[email protected]+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:[email protected]+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; 
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))將1天遞增的$date1當前值,直到它等於$date2

當一個日期沒有一個值時,它將爲零,如果該日期存在,它將根據MySQL結果得到總和。

+0

@downvoter爲什麼?????它在我的項目中爲我工作 – androidnation

+0

我會試試這個...... –

+0

$ date1和$ date2應該是strtotime的值嗎? –

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 
    } 
} 
+0

但爲什麼30天? –

+0

它的一個月,如果你想使它動態,那麼我們需要找到從日期到日期之間的總天數,並將它傳遞給$ d1 <$ totalDays。 @HerilMuratovic – RJParikh

+0

是的,我需要它是動態的。 –