当前位置:首页 > CMS教程 > 其它CMS > 列表

yii 框架实现按天,月,年,自定义时间段统计数据的方法分析

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-23 12:40:48 浏览: 评论:0 

本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法,分享给大家供大家参考,具体如下:

天(day): 格式Y-m-d

月(month):格式Y-m

年(year):格式Y

时间段(range): 格式Y-m-d

首先计算时间

天0-23小时

$rangeTime = range(0, 23);

月:1-月底

  1. // $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); 
  2. $days = date("t",strtotime($year . '-' . $month)); 
  3. // 生成1-days的天 
  4. $rangeTime = range(1, $days); 

年:1-12月

$rangeTime = range(1, 12);

时间段;开始时间-结束时间

  1. $stimestamp = strtotime($time); 
  2. $etimestamp = strtotime($time2); 
  3. // 计算日期段内有多少天 
  4. $days = ($etimestamp - $stimestamp) / 86400 + 1; 
  5. // 保存每天日期 
  6. for($i = 0; $i < $days$i++){ 
  7.   $newTimeStamp = $stimestamp + (86400 * $i); 
  8.   $rangeTime[] = date('Y-m-d'$newTimeStamp); 
  9.   $labels[] = date('d'$newTimeStamp) . Yii::t('backend''day'); 

封装一下

  1. /** 
  2.    * 获取label和时间段 
  3.    * type: day, month, year, range 
  4.    * time: 日期; day为具体的天y-m-d, month为具体的月y-m, year为具体的年y 
  5.    * time2 日期, 时间段的第二个时间 
  6.    */ 
  7.   public function getLabelAndRangeTime($type$time$time2) { 
  8.     if(emptyempty($time)) { 
  9.       $time = date('Y-m-d', time()); 
  10.     } 
  11.    
  12.     $labels = []; 
  13.     $rangeTime = []; 
  14.    
  15.     if($type == 'day') { 
  16.       // 生成1-24小时 
  17.       $rangeTime = range(0, 23); 
  18.       foreach ($rangeTime as $key => $val) { 
  19.         $label = $val . Yii::t('backend''hour'); 
  20.         $labels[] = $label
  21.       } 
  22.     } else if($type == 'month') { 
  23.       $dateArr = explode('-'$time); 
  24.       if(count($dateArr > 1)) { 
  25.         $year = $dateArr[0]; 
  26.         $month = $dateArr[1]; 
  27.         $time = $year
  28.         $time2 = $month
  29.         // 获取当前年月的天数 
  30.         // $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); 
  31.         $days = date("t",strtotime($year . '-' . $month)); 
  32.         // 生成1-days的天 
  33.         $rangeTime = range(1, $days); 
  34.    
  35.         foreach ($rangeTime as $key => $val) { 
  36.           $label = $val . Yii::t('backend''day'); 
  37.           $labels[] = $label
  38.         } 
  39.       } 
  40.     } else if($type == 'year') { 
  41.       // 生成1-12月 
  42.       $rangeTime = range(1, 12); 
  43.       foreach ($rangeTime as $key => $val) { 
  44.         $label = $val . Yii::t('backend''month'); 
  45.         $labels[] = $label
  46.       } 
  47.     } else if($type == 'range') { 
  48.       $stimestamp = strtotime($time); 
  49.       $etimestamp = strtotime($time2); 
  50.       // 计算日期段内有多少天 
  51.       $days = ($etimestamp - $stimestamp) / 86400 + 1; 
  52.       // 保存每天日期 
  53.       for($i = 0; $i < $days$i++){ 
  54.         $newTimeStamp = $stimestamp + (86400 * $i); 
  55.         $rangeTime[] = date('Y-m-d'$newTimeStamp); 
  56.         $labels[] = date('d'$newTimeStamp) . Yii::t('backend''day'); 
  57.       } 
  58.     } 
  59.    
  60.       
  61.     return [ 
  62.       'type'   => $type
  63.       'time'   => $time
  64.       'time2'   => $time2
  65.       'rangeTime' => $rangeTime
  66.       'labels'  => $labels 
  67.     ]; 
  68.   } 

然后查询数据库

  1. $query = Order::find(); 
  2.     if($type == 'day') { 
  3.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d %H") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  4.             ->where(['FROM_UNIXTIME(pay_at,"%Y-%m-%d")' => $time]); 
  5.     } else if($type == 'month') { 
  6.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  7.             ->where(['FROM_UNIXTIME(pay_at,"%Y-%m")' => ($time . '-' . $time2)]); 
  8.     } else if ($type == 'year') { 
  9.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  10.             ->where(['FROM_UNIXTIME(pay_at,"%Y")' => $time]); 
  11.     } else if ($type == 'range') { 
  12.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  13.             ->where(['between''FROM_UNIXTIME(pay_at,"%Y-%m-%d")'$time$time2]); 
  14.     } 
  15.     $data = $query->andWhere(['pay_status' => 2])->groupBy('char_time')->all(); 

按时间排列下

  1. $dataArr = []; 
  2. foreach ($data as $allKey => $allVal) {  
  3.       $dataArr[$allVal->char_time]['char_time'] = $allVal->char_time; 
  4.       $dataArr[$allVal->char_time]['total_order'] = $allVal->total_order; 
  5.       $dataArr[$allVal->char_time]['total_order_amount'] = bcdiv($allVal->total_order_amount, 100, 2); 

再按时间获取对应数据

  1. foreach ($rangeTime as $key => $val) { 
  2.       if($type == 'range') { 
  3.         if (array_key_exists($val$dataArr)) { 
  4.           $charCountDatas[] = $dataArr[$val]['total_order']; 
  5.           $charAmountDatas[] = $dataArr[$val]['total_order_amount']; 
  6.         } else { 
  7.           $charCountDatas[] = 0; 
  8.           $charAmountDatas[] = 0; 
  9.         } 
  10.       } else { 
  11.         $theNow = strlen($val) == 2 ? $val : '0' . $val
  12.    
  13.         if($type == 'day') { 
  14.           $theTime = $time . ' ' . $theNow
  15.         } else if($type == 'month') { 
  16.           $theTime = $time . '-' . $time2 . '-' . $theNow
  17.         } else if($type == 'year') { 
  18.           $theTime = $time . '-' . $theNow
  19.         } 
  20.    
  21.         if (array_key_exists($theTime$dataArr)) { 
  22.           $charCountDatas[] = $dataArr[$theTime]['total_order']; 
  23.           $charAmountDatas[] = $dataArr[$theTime]['total_order_amount']; 
  24.         } else { 
  25.           $charCountDatas[] = 0; 
  26.           $charAmountDatas[] = 0; 
  27.         } 
  28.       } 
  29.     } 

封装下

  1. /** 
  2.    * 时间段内支付订单量及金额 
  3.    * type 类型: day, month, year 
  4.    * time: 时间, day: 选择的时间; month: 表示年;year: 表示年; range: 第一个时间 
  5.    * time2: 时间: day: ''; month: 表示月;year: ''; range: 第二个时间  
  6.    * rangeTime 时间段 day: 1-24小时; month: 1-30天; year:1-12月,range: time和time2之间的天 
  7.    */ 
  8.   public function getDayOrderPayChar($type$time$time2$rangeTime) { 
  9.     $query = Order::find(); 
  10.     if($type == 'day') { 
  11.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d %H") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  12.             ->where(['FROM_UNIXTIME(pay_at,"%Y-%m-%d")' => $time]); 
  13.     } else if($type == 'month') { 
  14.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  15.             ->where(['FROM_UNIXTIME(pay_at,"%Y-%m")' => ($time . '-' . $time2)]); 
  16.     } else if ($type == 'year') { 
  17.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  18.             ->where(['FROM_UNIXTIME(pay_at,"%Y")' => $time]); 
  19.     } else if ($type == 'range') { 
  20.       $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d") as char_time''COUNT(id) as total_order''SUM(pay_amount) as total_order_amount']) 
  21.             ->where(['>=''FROM_UNIXTIME(pay_at,"%Y-%m-%d")'$time]) 
  22.             ->andWhere(['<=''FROM_UNIXTIME(pay_at,"%Y-%m-%d")'$time2]); 
  23.     } 
  24.     $data = $query->andWhere(['pay_status' => 2])->groupBy('char_time')->all(); 
  25.    
  26.    
  27.     $dataArr = []; 
  28.     foreach ($data as $allKey => $allVal) {  
  29.       $dataArr[$allVal->char_time]['char_time'] = $allVal->char_time; 
  30.       $dataArr[$allVal->char_time]['total_order'] = $allVal->total_order; 
  31.       $dataArr[$allVal->char_time]['total_order_amount'] = bcdiv($allVal->total_order_amount, 100, 2); 
  32.     } 
  33.    
  34.     $charCountDatas = []; 
  35.     $charAmountDatas = []; 
  36.     foreach ($rangeTime as $key => $val) { 
  37.       if($type == 'range') { 
  38.         if (array_key_exists($val$dataArr)) { 
  39.           $charCountDatas[] = $dataArr[$val]['total_order']; 
  40.           $charAmountDatas[] = $dataArr[$val]['total_order_amount']; 
  41.         } else { 
  42.           $charCountDatas[] = 0; 
  43.           $charAmountDatas[] = 0; 
  44.         } 
  45.       } else { 
  46.         $theNow = strlen($val) == 2 ? $val : '0' . $val
  47.    
  48.         if($type == 'day') { 
  49.           $theTime = $time . ' ' . $theNow
  50.         } else if($type == 'month') { 
  51.           $theTime = $time . '-' . $time2 . '-' . $theNow
  52.         } else if($type == 'year') { 
  53.           $theTime = $time . '-' . $theNow
  54.         } 
  55.    
  56.         if (array_key_exists($theTime$dataArr)) { 
  57.           $charCountDatas[] = $dataArr[$theTime]['total_order']; 
  58.           $charAmountDatas[] = $dataArr[$theTime]['total_order_amount']; 
  59.         } else { 
  60.           $charCountDatas[] = 0; 
  61.           $charAmountDatas[] = 0; 
  62.         } 
  63.       } 
  64.     } 
  65.    
  66.     $res = [ 
  67.       'count' => [ 
  68.         'name' => Yii::t('backend''hour_order_pay_count_title'),  
  69.         'color' => '#99CC33',  
  70.         'charData' => $charCountDatas 
  71.       ], 
  72.       'amount' => [ 
  73.         'name' => Yii::t('backend''hour_order_pay_amount_title'),  
  74.         'color' => '#99CC33',  
  75.         'charData' => $charAmountDatas 
  76.       ] 
  77.       ]; 
  78.    
  79.     return $res
  80.   } 

前端

  1. <div class="clearfix dashboard-time-select"
  2.   <div class="time-select"
  3.     <div class="row"
  4.       <div class="col-lg-2 col-md-2 col-sm-2"
  5.       <?= Html::dropDownList('day_type'$type, ['day' => Yii::t('backend''day'), 'month' => Yii::t('backend''month'), 'year' => Yii::t('backend''year'), 'range' => Yii::t('backend','range_time')], ['class' => 'type dashboard-time-type']) ?> 
  6.       </div>  
  7.       <div class="col-lg-7 col-md-7 col-sm-7"
  8.         <div class="dashboard-time-box"
  9.           <div class="dashboard-time-picker dashboard-time-day <?= ($type == 'day') ? '' : 'hide' ;?>"
  10.             <?= DateTimePicker::widget([ 
  11.               'name' => 'time'
  12.               'value' => (!emptyempty($time) && $type == 'day') ? $time : ''
  13.               'options' => ['placeholder' => Yii::t('backend''date'), 'autocomplete' => 'off''class' => 'time'], 
  14.               'removeButton' => false, 
  15.               'pluginOptions' => [ 
  16.                 'format' => 'yyyy-mm-dd'
  17.                 'startView' => 'month'
  18.                 'minView' => 'month'
  19.                 'maxView' => 'month'
  20.                 'autoclose' => true 
  21.               ] 
  22.             ]) ?> 
  23.           </div> 
  24.           <div class="dashboard-time-picker dashboard-time-month <?= ($type == 'month') ? '' : 'hide' ;?>"
  25.             <?= DateTimePicker::widget([ 
  26.               'name' => 'time'
  27.               'value' => (!emptyempty($time) && $type == 'month') ? $time : ''
  28.               'options' => ['placeholder' => Yii::t('backend''date'), 'autocomplete' => 'off''class' => 'time'], 
  29.               'removeButton' => false, 
  30.               'pluginOptions' => [ 
  31.                 'format' => 'yyyy-mm'
  32.                 'startView' => 'year'
  33.                 'minView' => 'year'
  34.                 'maxView' => 'year'
  35.                 'autoclose' => true 
  36.               ] 
  37.             ]) ?> 
  38.           </div> 
  39.           <div class="dashboard-time-picker dashboard-time-year <?= ($type == 'year') ? '' : 'hide' ;?>"
  40.             <?= DateTimePicker::widget([ 
  41.               'name' => 'time'
  42.               'value' => (!emptyempty($time) && $type == 'year') ? $time : ''
  43.               'options' => ['placeholder' => Yii::t('backend''date'), 'autocomplete' => 'off''class' => 'time'], 
  44.               'removeButton' => false, 
  45.               'pluginOptions' => [ 
  46.                 'format' => 'yyyy'
  47.                 'startView' => 'decade'
  48.                 'minView' => 'decade'
  49.                 'maxView' => 'decade'
  50.                 'autoclose' => true 
  51.               ] 
  52.             ]) ?> 
  53.           </div> 
  54.           <div class="dashboard-time-picker dashboard-time-range <?= ($type == 'range') ? '' : 'hide' ;?>"
  55.             <div class="row"
  56.               <div class="col-lg-6 col-md-6 col-sm-6 range-start"
  57.                 <?= DateTimePicker::widget([ 
  58.                   'name' => 'time'
  59.                   'value' => (!emptyempty($time) && $type == 'range') ? $time : ''
  60.                   'options' => ['placeholder' => Yii::t('backend''date'), 'autocomplete' => 'off''class' => 'time time2'], 
  61.                   'removeButton' => false, 
  62.                   'pluginOptions' => [ 
  63.                     'format' => 'yyyy-mm-dd'
  64.                     'startView' => 'month'
  65.                     'minView' => 'month'
  66.                     'maxView' => 'month'
  67.                     'autoclose' => true 
  68.                   ] 
  69.                 ]) ?> 
  70.               </div> 
  71.               <div class="col-lg-6 col-md-6 col-sm-6 range-end"
  72.                 <?= DateTimePicker::widget([ 
  73.                   'name' => 'time2'
  74.                   'value' => (!emptyempty($time2) && $type == 'range') ? $time2 : ''
  75.                   'options' => ['placeholder' => Yii::t('backend''date'), 'autocomplete' => 'off''class' => 'time time2'], 
  76.                   'removeButton' => false, 
  77.                   'pluginOptions' => [ 
  78.                     'format' => 'yyyy-mm-dd'
  79.                     'startView' => 'month'
  80.                     'minView' => 'month'
  81.                     'maxView' => 'month'
  82.                     'autoclose' => true 
  83.                   ] 
  84.                 ]) ?> 
  85.               </div> 
  86.             </div> 
  87.           </div> 
  88.         </div> 
  89.         
  90.       </div>  
  91.       <div class="col-lg-2 col-md-2 col-sm-2"
  92.       <?= Html::button(Yii::t('backend''sure'), ['class' => 'btn btn-success btn-dashboard-time''data-url' => $url]) ?> 
  93.       </div>  
  94.     </div> 
  95.   </div> 
  96. </div> 

确认按钮

  1. $('.dashboard-time-select .btn-dashboard-time').click(function() { 
  2.     var url = $(this).attr('data-url'); 
  3.     var timeSelect = $(this).parent().parent(); 
  4.     var type = timeSelect.find('.type').val(); 
  5.     var time = ''
  6.     var time2 = ''
  7.     if(type == 'day') { 
  8.       time = timeSelect.find('.dashboard-time-day input').val(); 
  9.     } else if(type == 'month') { 
  10.       time = timeSelect.find('.dashboard-time-month input').val(); 
  11.     } else if(type == 'year') { 
  12.       time = timeSelect.find('.dashboard-time-year input').val(); 
  13.     } else if(type == 'range') { 
  14.       time = timeSelect.find('.dashboard-time-range .range-start input').val(); 
  15.       time2 = timeSelect.find('.dashboard-time-range .range-end input').val(); 
  16.     } 
  17.     window.location.href = baseBackend + '/' + url + '?type=' + type + '&time=' + time + '&time2=' + time2 
  18.   }) 
  19.   $('.dashboard-time-select .dashboard-time-type').change(function() { 
  20.     var type = $(this).val(); 
  21.     $('.dashboard-time-select .dashboard-time-picker').addClass('hide'); 
  22.     $('.dashboard-time-select .dashboard-time-' + type).removeClass('hide'); 
  23.   })

Tags: yii自定义时间段

分享到: