即使没有可用数据,也会显示每月的每一天

时间:2013-02-24 22:10:59

标签: php sql

我希望在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}";

3 个答案:

答案 0 :(得分: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)。

答案 1 :(得分: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');
}

答案 2 :(得分: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++;
    }
}

$ arr就像$ r一样,但包含了当月的所有日子。