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 相关文章推荐
漂亮但不安全的CTB
Oct 09 PHP
针对初学PHP者的疑难问答(1)
Oct 09 PHP
收集的PHP中与数组相关的函数
Mar 22 PHP
简单的PHP图片上传程序
Mar 27 PHP
Zend 输出产生XML解析错误
Mar 03 PHP
Php output buffering缓存及程序缓存深入解析
Jul 15 PHP
Thinkphp多文件上传实现方法
Oct 31 PHP
php的dl函数用法实例
Nov 06 PHP
php获得网站访问统计信息类Compete API用法实例
Apr 02 PHP
一个PHP实现的轻量级简单爬虫
Jul 08 PHP
PHP实现递归目录的5种方法
Oct 27 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实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
说明你的Javascript技术很烂的五个原因
2011/04/26 Javascript
JS跨域代码片段
2012/08/30 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
js Array操作的最简短最容易理解方法
2013/12/09 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JavaScript类继承及实例化的方法
2015/07/25 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
JavaScript与JQUERY获取元素的宽、高和位置
2017/02/26 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python使用str &amp; repr转换字符串
2016/10/13 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
分析经典Python开发工程师面试题
2019/04/08 Python
Python获取数据库数据并保存在excel表格中的方法
2019/06/12 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
python 实现围棋游戏(纯tkinter gui)
2020/11/13 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
Laravel中Kafka的使用详解
2021/03/24 PHP
查环查孕证明
2014/01/10 职场文书
秘书英文求职信范文
2014/01/31 职场文书
喜之郎果冻广告词
2014/03/20 职场文书
4s店市场专员岗位职责
2014/04/09 职场文书
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
2015年银行柜员工作总结报告
2015/04/01 职场文书
python实现商品进销存管理系统
2022/05/30 Python