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的单引号和双引号 字符串效率
May 27 PHP
浅析PHP中Collection 类的设计
Jun 21 PHP
Win7 64位系统下PHP连接Oracle数据库
Aug 20 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
PHP单例模式简单用法示例
Jun 23 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
php实现数字补零的方法总结
Sep 12 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
php无限级分类实现评论及回复功能
Feb 18 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
关于js和php对url编码的处理方法
2014/03/04 PHP
yii2 modal弹窗之ActiveForm ajax表单异步验证
2016/06/13 PHP
推荐30个新鲜出炉的精美 jQuery 效果
2012/03/26 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
2014/08/15 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
vue.js选中动态绑定的radio的指定项
2017/06/02 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
2017/08/11 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
详解Vue之计算属性
2020/06/20 Javascript
js实现表格数据搜索
2020/08/09 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
英国最大的线上保健品零售商之一:Vitamin Planet
2016/12/01 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
旅游投诉信范文
2015/07/02 职场文书
交通事故协议书范本
2016/03/19 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
导游词之井冈山
2019/11/20 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
CSS基础详解
2021/10/16 HTML / CSS