1. 程式人生 > 程式設計 >yii 框架實現按天,月,年,自定義時間段統計資料的方法分析

yii 框架實現按天,月,年,自定義時間段統計資料的方法分析

本文例項講述了yii 框架實現按天,月,年,自定義時間段統計資料的方法。分享給大家供大家參考,具體如下:

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

月(month):格式Y-m

年(year):格式Y

時間段(range): 格式Y-m-d

首先計算時間

天0-23小時

$rangeTime = range(0,23);

月:1-月底

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

年:1-12月

$rangeTime = range(1,12);

時間段;開始時間-結束時間

$stimestamp = strtotime($time);
$etimestamp = strtotime($time2);
// 計算日期段內有多少天
$days = ($etimestamp - $stimestamp) / 86400 + 1;
// 儲存每天日期
for($i = 0; $i < $days; $i++){
  $newTimeStamp = $stimestamp + (86400 * $i);
  $rangeTime[] = date('Y-m-d',$newTimeStamp);
  $labels[] = date('d',$newTimeStamp) . Yii::t('backend','day');
}

封裝一下

/**
   * 獲取label和時間段
   * type: day,month,year,range
   * time: 日期; day為具體的天y-m-d, month為具體的月y-m, year為具體的年y
   * time2 日期, 時間段的第二個時間
   */
  public function getLabelAndRangeTime($type,$time,$time2) {
    if(empty($time)) {
      $time = date('Y-m-d',time());
    }
 
    $labels = [];
    $rangeTime = [];
 
    if($type == 'day') {
      // 生成1-24小時
      $rangeTime = range(0,23);
      foreach ($rangeTime as $key => $val) {
        $label = $val . Yii::t('backend','hour');
        $labels[] = $label;
      }
    } else if($type == 'month') {
      $dateArr = explode('-',$time);
      if(count($dateArr > 1)) {
        $year = $dateArr[0];
        $month = $dateArr[1];
        $time = $year;
        $time2 = $month;
        // 獲取當前年月的天數
        // $days = cal_days_in_month(CAL_GREGORIAN,$year);
        $days = date("t",strtotime($year . '-' . $month));
        // 生成1-days的天
        $rangeTime = range(1,$days);
 
        foreach ($rangeTime as $key => $val) {
          $label = $val . Yii::t('backend','day');
          $labels[] = $label;
        }
      }
    } else if($type == 'year') {
      // 生成1-12月
      $rangeTime = range(1,12);
      foreach ($rangeTime as $key => $val) {
        $label = $val . Yii::t('backend','month');
        $labels[] = $label;
      }
    } else if($type == 'range') {
      $stimestamp = strtotime($time);
      $etimestamp = strtotime($time2);
      // 計算日期段內有多少天
      $days = ($etimestamp - $stimestamp) / 86400 + 1;
      // 儲存每天日期
      for($i = 0; $i < $days; $i++){
        $newTimeStamp = $stimestamp + (86400 * $i);
        $rangeTime[] = date('Y-m-d',$newTimeStamp);
        $labels[] = date('d','day');
      }
    }
 
    
    return [
      'type'   => $type,'time'   => $time,'time2'   => $time2,'rangeTime' => $rangeTime,'labels'  => $labels
    ];
  }

然後查詢資料庫

$query = Order::find();
    if($type == 'day') {
      $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'])
            ->where(['FROM_UNIXTIME(pay_at,"%Y-%m-%d")' => $time]);
    } else if($type == 'month') {
      $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m-%d") as char_time',"%Y-%m")' => ($time . '-' . $time2)]);
    } else if ($type == 'year') {
      $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m") as char_time',"%Y")' => $time]);
    } else if ($type == 'range') {
      $query = $query->select(['FROM_UNIXTIME(pay_at,'SUM(pay_amount) as total_order_amount'])
            ->where(['between','FROM_UNIXTIME(pay_at,"%Y-%m-%d")',$time2]);
    }
    $data = $query->andWhere(['pay_status' => 2])->groupBy('char_time')->all();

按時間排列下

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

再按時間獲取對應資料

foreach ($rangeTime as $key => $val) {
      if($type == 'range') {
        if (array_key_exists($val,$dataArr)) {
          $charCountDatas[] = $dataArr[$val]['total_order'];
          $charAmountDatas[] = $dataArr[$val]['total_order_amount'];
        } else {
          $charCountDatas[] = 0;
          $charAmountDatas[] = 0;
        }
      } else {
        $theNow = strlen($val) == 2 ? $val : '0' . $val;
 
        if($type == 'day') {
          $theTime = $time . ' ' . $theNow;
        } else if($type == 'month') {
          $theTime = $time . '-' . $time2 . '-' . $theNow;
        } else if($type == 'year') {
          $theTime = $time . '-' . $theNow;
        }
 
        if (array_key_exists($theTime,$dataArr)) {
          $charCountDatas[] = $dataArr[$theTime]['total_order'];
          $charAmountDatas[] = $dataArr[$theTime]['total_order_amount'];
        } else {
          $charCountDatas[] = 0;
          $charAmountDatas[] = 0;
        }
      }
    }

封裝下

/**
   * 時間段內支付訂單量及金額
   * type 型別: day, month, year
   * time: 時間, day: 選擇的時間; month: 表示年;year: 表示年; range: 第一個時間
   * time2: 時間: day: ''; month: 表示月;year: ''; range: 第二個時間 
   * rangeTime 時間段 day: 1-24小時; month: 1-30天; year:1-12月,range: time和time2之間的天
   */
  public function getDayOrderPayChar($type,$time2,$rangeTime) {
    $query = Order::find();
    if($type == 'day') {
      $query = $query->select(['FROM_UNIXTIME(pay_at,'SUM(pay_amount) as total_order_amount'])
            ->where(['>=',$time])
            ->andWhere(['<=',$time2]);
    }
    $data = $query->andWhere(['pay_status' => 2])->groupBy('char_time')->all();
 
 
    $dataArr = [];
    foreach ($data as $allKey => $allVal) { 
      $dataArr[$allVal->char_time]['char_time'] = $allVal->char_time;
      $dataArr[$allVal->char_time]['total_order'] = $allVal->total_order;
      $dataArr[$allVal->char_time]['total_order_amount'] = bcdiv($allVal->total_order_amount,2);
    }
 
    $charCountDatas = [];
    $charAmountDatas = [];
    foreach ($rangeTime as $key => $val) {
      if($type == 'range') {
        if (array_key_exists($val,$dataArr)) {
          $charCountDatas[] = $dataArr[$theTime]['total_order'];
          $charAmountDatas[] = $dataArr[$theTime]['total_order_amount'];
        } else {
          $charCountDatas[] = 0;
          $charAmountDatas[] = 0;
        }
      }
    }
 
    $res = [
      'count' => [
        'name' => Yii::t('backend','hour_order_pay_count_title'),'color' => '#99CC33','charData' => $charCountDatas
      ],'amount' => [
        'name' => Yii::t('backend','hour_order_pay_amount_title'),'charData' => $charAmountDatas
      ]
      ];
 
    return $res;
  }

前端

<div class="clearfix dashboard-time-select">
  <div class="time-select">
    <div class="row">
      <div class="col-lg-2 col-md-2 col-sm-2">
      <?= 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']) ?>
      </div> 
      <div class="col-lg-7 col-md-7 col-sm-7">
        <div class="dashboard-time-box">
          <div class="dashboard-time-picker dashboard-time-day <?= ($type == 'day') ? '' : 'hide' ;?>">
            <?= DateTimePicker::widget([
              'name' => 'time','value' => (!empty($time) && $type == 'day') ? $time : '','options' => ['placeholder' => Yii::t('backend','date'),'autocomplete' => 'off','class' => 'time'],'removeButton' => false,'pluginOptions' => [
                'format' => 'yyyy-mm-dd','startView' => 'month','minView' => 'month','maxView' => 'month','autoclose' => true
              ]
            ]) ?>
          </div>
          <div class="dashboard-time-picker dashboard-time-month <?= ($type == 'month') ? '' : 'hide' ;?>">
            <?= DateTimePicker::widget([
              'name' => 'time','value' => (!empty($time) && $type == 'month') ? $time : '','pluginOptions' => [
                'format' => 'yyyy-mm','startView' => 'year','minView' => 'year','maxView' => 'year','autoclose' => true
              ]
            ]) ?>
          </div>
          <div class="dashboard-time-picker dashboard-time-year <?= ($type == 'year') ? '' : 'hide' ;?>">
            <?= DateTimePicker::widget([
              'name' => 'time','value' => (!empty($time) && $type == 'year') ? $time : '','pluginOptions' => [
                'format' => 'yyyy','startView' => 'decade','minView' => 'decade','maxView' => 'decade','autoclose' => true
              ]
            ]) ?>
          </div>
          <div class="dashboard-time-picker dashboard-time-range <?= ($type == 'range') ? '' : 'hide' ;?>">
            <div class="row">
              <div class="col-lg-6 col-md-6 col-sm-6 range-start">
                <?= DateTimePicker::widget([
                  'name' => 'time','value' => (!empty($time) && $type == 'range') ? $time : '','class' => 'time time2'],'pluginOptions' => [
                    'format' => 'yyyy-mm-dd','autoclose' => true
                  ]
                ]) ?>
              </div>
              <div class="col-lg-6 col-md-6 col-sm-6 range-end">
                <?= DateTimePicker::widget([
                  'name' => 'time2','value' => (!empty($time2) && $type == 'range') ? $time2 : '','autoclose' => true
                  ]
                ]) ?>
              </div>
            </div>
          </div>
        </div>
      
      </div> 
      <div class="col-lg-2 col-md-2 col-sm-2">
      <?= Html::button(Yii::t('backend','sure'),['class' => 'btn btn-success btn-dashboard-time','data-url' => $url]) ?>
      </div> 
    </div>
  </div>
</div>

確認按鈕

$('.dashboard-time-select .btn-dashboard-time').click(function() {
    var url = $(this).attr('data-url');
    var timeSelect = $(this).parent().parent();
    var type = timeSelect.find('.type').val();
    var time = '';
    var time2 = '';
    if(type == 'day') {
      time = timeSelect.find('.dashboard-time-day input').val();
    } else if(type == 'month') {
      time = timeSelect.find('.dashboard-time-month input').val();
    } else if(type == 'year') {
      time = timeSelect.find('.dashboard-time-year input').val();
    } else if(type == 'range') {
      time = timeSelect.find('.dashboard-time-range .range-start input').val();
      time2 = timeSelect.find('.dashboard-time-range .range-end input').val();
    }
    window.location.href = baseBackend + '/' + url + '?type=' + type + '&time=' + time + '&time2=' + time2
  })
  $('.dashboard-time-select .dashboard-time-type').change(function() {
    var type = $(this).val();
    $('.dashboard-time-select .dashboard-time-picker').addClass('hide');
    $('.dashboard-time-select .dashboard-time-' + type).removeClass('hide');
  })

更多關於Yii相關內容感興趣的讀者可檢視本站專題:《Yii框架入門及常用技巧總結》、《php優秀開發框架總結》、《smarty模板入門基礎教程》、《php面向物件程式設計入門教程》、《php字串(string)用法總結》、《php+mysql資料庫操作入門教程》及《php常見資料庫操作技巧彙總》

希望本文所述對大家基於Yii框架的PHP程式設計有所幫助。