日期统计表数据,mysql没数据的日期进行补充日期

懒散的作者
2020-11-10 / 0 评论 / 544 阅读 / 正在检测是否收录...
统计用到的日期,不用foreach循环得到日期再查N天的N条sql,效率比较低
换一种方法,查一遍sql得出日期,比如一个月就 1-2 ,1-3,1-5才有数据,但统计要展示1-30号,将其他没数据补充日期,数据填充0

注意的是:先查询得到sql数据,再补充日期,而不是得到日期再循环体内操作mysql得到统计。比如30天就循环30条sql 非常不友好

第一步

 $month = Request::param('month', date('Y-m'));

$startMonth = date("Y-m-01", strtotime( $month));
$endMonth = date("Y-m-d", strtotime($month));

第二步(得到数据)

    $view = self::alias('m')
            ->join('custom c','c.message_no=m.message_no','left')
            ->join('ts_custom ts','ts.message_no=c.message_no')
            ->where('follow_stage','in',[8,9,10,11,12,13])
            ->whereRaw("DATE_FORMAT( ts.done_time, '%Y-%m-%d' ) BETWEEN "."'$startMonth ' and ". "'$endMonth'")
            ->field($field);

   $log = $view->group("DATE_FORMAT(ts.done_time, '%Y-%m-%d')")->order('date asc')->select()->toArray();

第三步

$str = ['date'=>'','follow_stage_8'=>''];
DataFillDate($log,[$startMonth,$endMonth],$str);
    /* *
 * 填补输出数据(天)
 * @param $log          array  数据 (先查询好数据再操作如下)
 * @param $arr_time     array  时间区间
 * @param $ex_path      array  数据结构
 * */
function DataFillDate($log,$arr_time = [],$str = [])
{
    $i = 0;
    $j = 0;
    $dateL = [];
    $date[0] = $arr_time[0];
    
//将需要的开始跟结束日期,进行并且得出需要多少天 ,比如 2020-1-3 ~ 2020-1-31 。中间相差28天。
    $stimestamp = strtotime($arr_time[0]);
    $etimestamp = strtotime($arr_time[1]);
    // 计算日期段内有多少天
    $days = ($etimestamp-$stimestamp)/86400+1;

    // 保存每天日期
    $date = array();

 //循环得到的日期
    for($i=0; $i<$days; $i++){
        $date[] = date('Y-m-d', $stimestamp+(86400*$i));
    }

    //mysql得到的日期条数
    foreach ($log as $key => $val){
        $dateL[$key] = $val['date'];
    }

 //进行差异比较
    count($dateL) > 0 ? $c = array_diff($date,$dateL) : $c = $date;

//这一段进行数据填充0
    $strR = [];
    foreach ($c as $k => $kv){
        foreach ($str as $s => $sv){
            $strR[$k][$s] = $s =='date' ? $kv : '0';
        }
    }

    $res = array_merge($strR,$log);
    foreach ($res as $r => $rv){
        $key = substr($rv['date'],0,4).substr($rv['date'],5,2).substr($rv['date'],8,10);
        $dd[$key] = $rv;
    }

//再排序
    rsort($dd);
    return $dd;
}
0

评论 (0)

取消