2017-03-01 121 views
1

我需要为过去30天的销售创建统计图。在某些日子里没有销售,所以我必须在这些日子里显示0。获取数据库的每日销售额 - 无销售日应显示0 - 过去30天的销售额

MySQL的结果

Array 
(
    [0] => Array 
     (
      [total] => 1 
      [soldDay] => 24 
     ) 

    [1] => Array 
     (
      [total] => 1 
      [soldDay] => 13 
     ) 

    [2] => Array 
     (
      [total] => 4 
      [soldDay] => 3 
     ) 

    [3] => Array 
     (
      [total] => 2 
      [soldDay] => 23 
     ) 

使用循环的

SELECT COUNT(*) as total, DAY(FROM_UNIXTIME(tmstmp)) AS soldDay 
FROM tl_voucher_create 
WHERE sold = 1 
GROUP BY soldDay 
ORDER BY tmstmp DESC 0,30 

PHP数组,我把值放入一个新的数组:

for ($x = $day; $x < 31; $x++) { 
    if (isset($this->_["soldDaily"][$x]["soldDay"])) { 
     $total[$x] = $this->_["soldDaily"][$x]["total"]; 
    } else { 
     $total[$x] = 0; 
    } 
} 

哪有我用va制作正确的输出在过去的30天里,按正确的顺序提供?

在此先感谢

回答

1

基地的实际日期查询:

SELECT COUNT(*) AS total, DATE(FROM_UNIXTIME(tmstmp)) AS sold_date 
FROM tl_voucher_create 
WHERE sold = 1 
    AND sold_date BETWEEN DATE(NOW() - INTERVAL 30 DAY) AND CURDATE() 
GROUP BY sold_date 
ORDER BY sold_date DESC 

假设从查询的结果是这样的:

$data = [ 
    [ 
     'total' => 7, 
     'sold_date' => '2017-02-28' 
    ], 
    [ 
     'total' => 19, 
     'sold_date' => '2017-02-27' 
    ], 
    [ 
     'total' => 8, 
     'sold_date' => '2017-02-24' 
    ], 
    [ 
     'total' => 5, 
     'sold_date' => '2017-02-22' 
    ], 
    [ 
     'total' => 12, 
     'sold_date' => '2017-02-21' 
    ] 
]; 

现在需要基础的PHP在一个实际的日期对象而不是一个数字30迭代循环,否则你会遇到各种问题和不准确的报告,因为日期并不简单从1到30循环(月份有不同的天数,你不能轻易跨回到前一个月,夏令时问题,日期在不同时区等不同)

// Organise the array by date 
$dates = []; 
foreach ($data as $day) { 
    $dates[$day['sold_date']] = $day['total']; 
} 

// Loop through the last 30 days and match each iteration with the data 
$d = new DateTime(); 
for ($i = 0; $i < 30; $i++) { 

    $date = $d->format('Y-m-d'); 

    // If there's no data for the specified date, use zero 
    $total = isset($dates[$date]) ? $dates[$date] : 0; 

    echo '<p>' . $total . ' sold on ' . $date . '</p>'; 

    $d->modify('-1 day'); 
} 
+0

好极了!多谢!! –