2013-02-24 3 views
1

Я хочу показать все дни месяца в инструкции SQL, а затем связать этот день с данными в моей таблице. Если в этот день нет данных, тогда он должен отображать нуль.Показать каждый день месяца, даже если данные отсутствуют.

Мой стол выглядит следующим образом.

IN | OUT | EARN | DATE 
10 20 0.25 01.02.2013 
2 15 0.55 03.02.2013 
7 45 0.25 05.02.2013 
8 25 0.75 12.02.2013 

я тогда хочу, чтобы результат выглядеть как этот

IN | OUT | EARN | DATE 
10 20 0.25 01.02.2013 
0 0  0.00 02.02.2013 
2 15 0.55 03.02.2013 
0 0  0.00 04.02.2013 
7 45 0.25 05.02.2013 
0 0  0.00 06.02.2013 
0 0  0.00 07.02.2013 
0 0  0.00 08.02.2013 
0 0  0.00 09.02.2013 
0 0  0.00 10.02.2013 
0 0  0.00 11.02.2013 
8 25 0.75 12.02.2013 

весь путь до конца месяца ...

Пожалуйста, вы можете помочь в этом, так что я могу разрешить отчет.

И мой SQL-им получить данные таким образом

$sql = "SELECT * FROM stats WHERE date >= '".$month_start."' AND date <= '".$month_end."' AND pid={$pid}"; 
+0

Как выглядит '$ month_start'? –

+0

'$ month_start = date ('Ym-01', strtotime ('this month'));' –

ответ

1

перебрать все дни:

$start = new \DateTime('first day of this month'); 
$end = new \DateTime('first day of this month + 1 month'); 
$period = new \DatePeriod($start, new \DateInterval('P1D'), $end); 

foreach($period as $day){ 
    // here check if you have records with this date and print them, 
    // otherwise print default values 
    print $day->format('d.m.Y'); 
} 
+0

Хмм не уверен, как использовать эту таблицу im make таким образом 'foreach ($ data as $ gt) { echo '' .date ('M d, Y', strtotime ($ gt ['date'])). ' '. $ Gt [' pView '].' '. $ Gt [' uView '].' '. $ Gt [' earn '].' '; } ' –

+0

Опубликовать, что в вашем Q? –

2

Попробуйте это:

SELECT `t`.`IN`, `t`.`OUT`, `t`.`EARN`, `d`.`DATE` 
FROM `table` AS `t` 
RIGHT JOIN (
    SELECT @date := @date + 1 AS `DATE` 
    FROM `tbl31` 
    JOIN (SELECT @date := 0) AS `temp` 
    LIMIT 31 
) AS `d` 
ON `d`.`DATE`=`t`.`DATE` 

table это имя вашей таблицы.
tbl31 - это таблица, имеющая более 30 строк (содержимое не важно).

Я действительно не знаю лучшего способа использования MySQL (предположим, вы используете MySQL).

+0

Конечно, вы можете сделать это легче с помощью php. –

+0

это с MySQL не работает для меня, что вы имеете в виду с php? Можете ли вы объяснить мне –

+0

Ответ одного Трика Пони показывает, как перебирать дни. Я отправлю еще один ответ, чтобы показать вам, как это делается на php. И чтобы мой запрос работал, вы должны заменить 'tbl31' таблицей с более чем 30 строками. –

0

Вы также можете перебирать дни месяца:

/* 
    $r is something like: 
    $r = array(
     array(
      'IN' => '10', 
      'OUT' => '20', 
      'EARN' => '0.25', 
      'DATE' => '01.02.2013' 
     ), 
     array(
      'IN' => '2', 
      'OUT' => '15', 
      'EARN' => '0.55', 
      'DATE' => '03.02.2013' 
     ), 
     array(
      'IN' => '7', 
      'OUT' => '45', 
      'EARN' => '0.25', 
      'DATE' => '05.02.2013' 
     ), 
     array(
      'IN' => '8', 
      'OUT' => '25', 
      'EARN' => '0.75', 
      'DATE' => '12.02.2013' 
     ) 
    ); 
*/ 
$arr = array(); // the result array 
$period = new DatePeriod(
    new DateTime('first day of this month'), 
    new DateInterval('P1D'), 
    new DateTime('first day of next month') 
); 
$ri = 0; 
foreach ($period as $day) { 
    $i = ((int)$day->format('j')) - 1; 
    $date = $day->format('d.m.Y'); 
    $arr[$i] = array(
     'IN' => '0.00', 
     'OUT' => '0.00', 
     'EARN' => '0.00', 
     'DATE' => $date 
    ); 
    if (array_key_exists($ri, $r) && $r[$ri]['DATE'] == $date) { 
     $arr[$i] = $r[$ri]; 
     $ri++; 
    } 
} 

$ обр это знать, как $ г, но содержит все дни в месяце.