yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
程序员文章站
2022-06-23 21:42:21
本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法。分享给大家供大家参考,具体如下:天(day): 格式y-m-d月(month):格式y-m年(year):格式y时间段(rang...
本文实例讲述了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'); })