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

2020-11-02 16:01:30 浏览数 (2)

本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法。分享给大家供大家参考,具体如下:

天(day): 格式Y-m-d

月(month):格式Y-m

年(year):格式Y

时间段(range): 格式Y-m-d

首先计算时间

天0-23小时

代码语言:javascript复制
$rangeTime = range(0, 23);

月:1-月底

代码语言:javascript复制
// $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);
$days = date("t",strtotime($year . '-' . $month));
// 生成1-days的天
$rangeTime = range(1, $days);

年:1-12月

代码语言:javascript复制
$rangeTime = range(1, 12);

时间段;开始时间-结束时间

代码语言:javascript复制
$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');
}

封装一下

代码语言:javascript复制
/**
   * 获取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
    ];
  }

然后查询数据库

代码语言:javascript复制
$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();

按时间排列下

代码语言:javascript复制
$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);
}

再按时间获取对应数据

代码语言:javascript复制
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;
        }
      }
    }

封装下

代码语言:javascript复制
/**
* 时间段内支付订单量及金额
* 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;
}

前端

代码语言:javascript复制
<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 

确认按钮

代码语言:javascript复制
$('.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程序设计有所帮助。

0 人点赞