• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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, $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程序设计有所帮助。

    您可能感兴趣的文章:
    • yii框架结合charjs实现统计30天数据的方法
    • Yii统计不同类型邮箱数量的方法
    • Yii中的relations数据关联查询及统计功能用法详解
    • 解析yii数据库的增删查改
    • Yii2 批量插入、更新数据实例
    • Yii2框架数据库简单的增删改查语法小结
    • Yii2.0高级框架数据库增删改查的一些操作
    • yii框架表单模型使用及以数组形式提交表单数据示例
    • Yii实现MySQL多数据库和读写分离实例分析
    • Yii+MYSQL锁表防止并发情况下重复数据的方法
    • Yii实现多数据库主从读写分离的方法
    • yii框架结合charjs统计上一年与当前年数据的方法示例
    上一篇:thinkphp5 框架结合plupload实现图片批量上传功能示例
    下一篇:yii框架结合charjs实现统计30天数据的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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