ThinkPHP5 (mySQL) 統計各個時間段內的訂單量

  • 背景
    今天在進行後臺數據監控時;
    需要對一天24小時的下單量進行時間段的統計;
    但是下單時間字段 pay_time 選取的是 timestamp 類型;
    此時需要進行時間段的數據分組剝離,在此做一下實現方式,請多指教 …

  • 環境

	框架:ThinkPHP5.1.2
	系統:nginx/win10	、phpStudy2017

實現方式

1. 首先,考慮到使用的是 group分組技巧;
  • 那麼就必須要將 pay_time 中記錄的字段數據進行 24時的定位切分;
    這裏可以用到 substring() 方法的支持 【字段取值舉例:2019-08-23 09:25:09
2. 以我的 ThinkPHP5框架的代碼規範
  • 源碼書寫如下:
$res = Db::name('order_goods og')
            ->field("substring(pay_time,12,2) hour,count(og.id) count")
            ->join("order_infos oi","oi.order_id = og.order_id")
            ->where([ ["pay_status","=",1]])
            ->group('hour')
            ->order('hour','asc')
            ->select();
  • 即對應的原生sql語句爲:
SELECT substring(pay_time,12,2) hour,count(og.id) count FROM tp5_xorder_goods og 
INNER JOIN `tp5_xorder_infos` `oi` ON `oi`.`order_id`=`og`.`order_id` 
WHERE `pay_status` = 1 
GROUP BY `hour` 
ORDER BY `hour` ASC
  • 得到的數據打印如下:
3. 之後就是對得到的數據進一步的整理
  • 以我使用 ECharts圖表庫 進行數據展示爲例,那麼我的處理方式如下:
$timeRes = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
        foreach ($timeRes as $key => $value){
            foreach ($res as $key2 => $value2){
                $hour = intval($value2['hour']);
                if ($key == $hour){
                    $timeRes[$key] = $value2['count'];
                    //echo "hour:".$hour.";key:".$key.";count:".$value2['count']."<br/>";
                    break;
                }else{
                    continue;
                }
            }
        }
4. 數據整合後,展示效果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章