我希望在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 :(得分: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一样,但包含了当月的所有日子。