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

2020-09-01 12:12:49

本文实例讲述了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, $month, $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', $newTimeStamp) . Yii::t('backend', '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', 'COUNT(id) as total_order', 'SUM(pay_amount) as total_order_amount'])            ->where(['FROM_UNIXTIME(pay_at,"%Y-%m")' => ($time . '-' . $time2)]);    } else if ($type == 'year') {      $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m") as char_time', 'COUNT(id) as total_order', 'SUM(pay_amount) as total_order_amount'])            ->where(['FROM_UNIXTIME(pay_at,"%Y")' => $time]);    } else if ($type == 'range') {      $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'])            ->where(['between', 'FROM_UNIXTIME(pay_at,"%Y-%m-%d")', $time, $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, $time, $time2, $rangeTime) {    $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', 'COUNT(id) as total_order', 'SUM(pay_amount) as total_order_amount'])            ->where(['FROM_UNIXTIME(pay_at,"%Y-%m")' => ($time . '-' . $time2)]);    } else if ($type == 'year') {      $query = $query->select(['FROM_UNIXTIME(pay_at,"%Y-%m") as char_time', 'COUNT(id) as total_order', 'SUM(pay_amount) as total_order_amount'])            ->where(['FROM_UNIXTIME(pay_at,"%Y")' => $time]);    } else if ($type == 'range') {      $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'])            ->where(['>=', 'FROM_UNIXTIME(pay_at,"%Y-%m-%d")', $time])            ->andWhere(['<=', '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);    }     $charCountDatas = [];    $charAmountDatas = [];    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;        }      }    }     $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'),         'color' => '#99CC33',         '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 : '',              'options' => ['placeholder' => Yii::t('backend', 'date'), 'autocomplete' => 'off', 'class' => 'time'],              'removeButton' => false,              '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 : '',              'options' => ['placeholder' => Yii::t('backend', 'date'), 'autocomplete' => 'off', 'class' => 'time'],              'removeButton' => false,              '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 : '',                  'options' => ['placeholder' => Yii::t('backend', 'date'), 'autocomplete' => 'off', 'class' => 'time time2'],                  'removeButton' => false,                  'pluginOptions' => [                    'format' => 'yyyy-mm-dd',                    'startView' => 'month',                    'minView' => 'month',                    'maxView' => 'month',                    '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 : '',                  'options' => ['placeholder' => Yii::t('backend', 'date'), 'autocomplete' => 'off', 'class' => 'time time2'],                  'removeButton' => false,                  'pluginOptions' => [                    'format' => 'yyyy-mm-dd',                    'startView' => 'month',                    'minView' => 'month',                    'maxView' => 'month',                    '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程序设计有所帮助。

相关文章 大家在看