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 相关文章推荐
支持oicq头像的留言簿(二)
Oct 09 PHP
php框架Phpbean说明
Jan 10 PHP
Fatal error: Call to undefined function curl_init()解决方法
Apr 09 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
CI框架安全类Security.php源码分析
Nov 04 PHP
实例讲解yii2.0在php命令行中运行的步骤
Dec 01 PHP
Symfony2 session用法实例分析
Feb 04 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
PHP基于接口技术实现简单的多态应用完整实例
Apr 26 PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 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后台如何避免用户直接进入方法实例
2013/10/15 PHP
php获取文件名后缀常用方法小结
2015/02/24 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
event.currentTarget与event.target的区别介绍
2012/12/31 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
2016/08/25 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
浅析JavaScript的几种Math函数,random(),ceil(),round(),floor()
2016/12/22 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
js实现GIF图片的分解和合成
2019/10/24 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
远程部署工具Fabric详解(支持Python3)
2019/07/04 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
python与mysql数据库交互的实现
2020/01/06 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Python动态导入模块和反射机制详解
2020/02/18 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
高中军训广播稿
2014/01/14 职场文书
高三学生评语大全
2014/04/25 职场文书
货物运输服务质量承诺书
2014/05/29 职场文书
安全口号大全
2014/06/21 职场文书
初中同学会活动方案
2014/08/22 职场文书
军训新闻稿范文
2015/07/17 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
laravel ajax curd 搜索登录判断功能的实现
2021/04/17 PHP
sql中mod()函数取余数的用法
2021/05/29 SQL Server