yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
发布:smiling 来源: PHP粉丝网 添加日期:2022-02-23 12:40:48 浏览: 评论:0
本文实例讲述了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(emptyempty($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' => (!emptyempty($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' => (!emptyempty($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' => (!emptyempty($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' => (!emptyempty($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' => (!emptyempty($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');
 - })
 
Tags: yii自定义时间段
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
 - PHP新手上路(一)(7)
 - 惹恼程序员的十件事(5)
 - PHP邮件发送例子,已测试成功(5)
 - 致初学者:PHP比ASP优秀的七个理由(4)
 - PHP会被淘汰吗?(4)
 - PHP新手上路(四)(4)
 - 如何去学习PHP?(2)
 - 简单入门级php分页代码(2)
 - php中邮箱email 电话等格式的验证(2)
 
