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}";
4

3 回答 3

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

于 2013-02-24T22:31:31.470 回答
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');
}
于 2013-02-24T22:23:00.357 回答
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 类似,但包含该月的所有日期。

于 2013-02-25T09:43:44.230 回答