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


Posted in PHP onApril 04, 2020

本文实例讲述了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框架的PHP程序设计有所帮助。

PHP 相关文章推荐
php-accelerator网站加速PHP缓冲的方法
Jul 30 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
PHP新手NOTICE错误常见解决方法
Dec 07 PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
thinkphp3.0输出重复两次的解决方法
Dec 19 PHP
PHP人民币金额转大写实例代码
Oct 02 PHP
php使用escapeshellarg时中文被过滤的解决方法
Jul 10 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 PHP
详解php命令注入攻击
Apr 06 PHP
PHP实现简单的计算器
Aug 28 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 #PHP
phpQuery采集网页实现代码实例
Apr 02 #PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 #PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 #PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
Mar 30 #PHP
TP5框架实现上传多张图片的方法分析
Mar 29 #PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 #PHP
You might like
PHP批量删除jQuery操作
2017/07/23 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
jQuery中的常用事件总结
2009/12/27 Javascript
JSON 学习之JSON in JavaScript详细使用说明
2010/02/23 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
使用do...while的方法输入一个月中所有的周日(实例代码)
2016/07/22 Javascript
微信小程序 location API接口详解及实例代码
2016/10/12 Javascript
JavaScript实现点击按钮复制指定区域文本(推荐)
2016/11/25 Javascript
js实现复制功能(多种方法集合)
2018/01/06 Javascript
vue实现路由切换改变title功能
2019/05/28 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
Vue 中使用富文本编译器wangEditor3的方法
2019/09/26 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
Python3基础之输入和输出实例分析
2014/08/18 Python
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python入门教程之运算符与控制流
2016/08/17 Python
独特的python循环语句
2016/11/20 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
如何用Python来理一理红楼梦里的那些关系
2019/08/14 Python
Pytorch之parameters的使用
2019/12/31 Python
Tensorflow中tf.ConfigProto()的用法详解
2020/02/06 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
违反课堂纪律检讨书
2014/01/19 职场文书
高中地理教学反思
2014/01/29 职场文书
银行爱岗敬业演讲稿
2014/05/05 职场文书
商家认证委托书格式
2014/10/16 职场文书
2014年少先队工作总结
2014/12/03 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
大学生团支书竞选稿
2015/11/21 职场文书
vue-treeselect的基本用法以及解决点击无法出现拉下菜单
2022/04/30 Vue.js