您好,登錄后才能下訂單哦!
這篇文章主要講解了“yii 框架如何實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“yii 框架如何實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)”吧!
天(day): 格式Y(jié)-m-d
月(month):格式Y(jié)-m
年(year):格式Y(jié)
時(shí)間段(range): 格式Y(jié)-m-d
首先計(jì)算時(shí)間
天0-23小時(shí)
$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);
時(shí)間段;開(kāi)始時(shí)間-結(jié)束時(shí)間
$stimestamp = strtotime($time); $etimestamp = strtotime($time2); // 計(jì)算日期段內(nèi)有多少天 $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和時(shí)間段 * type: day, month, year, range * time: 日期; day為具體的天y-m-d, month為具體的月y-m, year為具體的年y * time2 日期, 時(shí)間段的第二個(gè)時(shí)間 */ public function getLabelAndRangeTime($type, $time, $time2) { if(empty($time)) { $time = date('Y-m-d', time()); } $labels = []; $rangeTime = []; if($type == 'day') { // 生成1-24小時(shí) $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; // 獲取當(dāng)前年月的天數(shù) // $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); // 計(jì)算日期段內(nèi)有多少天 $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 ]; }
然后查詢數(shù)據(jù)庫(kù)
$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();
按時(shí)間排列下
$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); }
再按時(shí)間獲取對(duì)應(yīng)數(shù)據(jù)
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; } } }
封裝下
/** * 時(shí)間段內(nèi)支付訂單量及金額 * type 類型: day, month, year * time: 時(shí)間, day: 選擇的時(shí)間; month: 表示年;year: 表示年; range: 第一個(gè)時(shí)間 * time2: 時(shí)間: day: ''; month: 表示月;year: ''; range: 第二個(gè)時(shí)間 * rangeTime 時(shí)間段 day: 1-24小時(shí); 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>
確認(rèn)按鈕
$('.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 框架如何實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)yii 框架如何實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。