yii 框架實(shí)現(xiàn)按天,月,年,自定義時(shí)間段統(tǒng)計(jì)數(shù)據(jù)的方法分析
本文實(shí)例講述了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í)間段;開始時(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ù)庫
$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');
})
更多關(guān)于Yii相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Yii框架入門及常用技巧總結(jié)》、《php優(yōu)秀開發(fā)框架總結(jié)》、《smarty模板入門基礎(chǔ)教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對(duì)大家基于Yii框架的PHP程序設(shè)計(jì)有所幫助。
- yii框架結(jié)合charjs實(shí)現(xiàn)統(tǒng)計(jì)30天數(shù)據(jù)的方法
- Yii統(tǒng)計(jì)不同類型郵箱數(shù)量的方法
- Yii中的relations數(shù)據(jù)關(guān)聯(lián)查詢及統(tǒng)計(jì)功能用法詳解
- 解析yii數(shù)據(jù)庫的增刪查改
- Yii2 批量插入、更新數(shù)據(jù)實(shí)例
- Yii2框架數(shù)據(jù)庫簡(jiǎn)單的增刪改查語法小結(jié)
- Yii2.0高級(jí)框架數(shù)據(jù)庫增刪改查的一些操作
- yii框架表單模型使用及以數(shù)組形式提交表單數(shù)據(jù)示例
- Yii實(shí)現(xiàn)MySQL多數(shù)據(jù)庫和讀寫分離實(shí)例分析
- Yii+MYSQL鎖表防止并發(fā)情況下重復(fù)數(shù)據(jù)的方法
- Yii實(shí)現(xiàn)多數(shù)據(jù)庫主從讀寫分離的方法
- yii框架結(jié)合charjs統(tǒng)計(jì)上一年與當(dāng)前年數(shù)據(jù)的方法示例
相關(guān)文章
PHP+jQuery 注冊(cè)模塊的改進(jìn)(一):驗(yàn)證碼存入SESSION
本文主要是對(duì)上一篇文章模進(jìn)行改進(jìn),把驗(yàn)證碼寫入SESSION而不是把驗(yàn)證碼的文字返回客戶端的隱藏域,否則驗(yàn)證碼的意義就不復(fù)存在啦2014-10-10
Yii模型操作之criteria查找數(shù)據(jù)庫的方法
這篇文章主要介紹了Yii模型操作之criteria查找數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了Yii模型中criteria的實(shí)例化與查詢操作相關(guān)技巧,需要的朋友可以參考下2016-07-07
Zend Framework入門教程之Zend_Db數(shù)據(jù)庫操作詳解
這篇文章主要介紹了Zend Framework入門教程之Zend_Db數(shù)據(jù)庫操作,結(jié)合實(shí)例形式詳細(xì)分析了Zend_Db_Adapter的功能及數(shù)據(jù)庫操作的相關(guān)技巧,需要的朋友可以參考下2016-12-12
phpcms實(shí)現(xiàn)驗(yàn)證碼替換及phpcms實(shí)現(xiàn)全站搜索功能教程詳解
這篇文章主要介紹了phpcms的驗(yàn)證碼替換 及 phpcms實(shí)現(xiàn)全站搜索功能,需要的朋友可以參考下2017-12-12
php與c 實(shí)現(xiàn)按行讀取文件實(shí)例代碼
這篇文章主要介紹了php與c 實(shí)現(xiàn)按行讀取文件實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01
ThinkPHP實(shí)現(xiàn)轉(zhuǎn)換數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)到對(duì)應(yīng)類型的方法
這篇文章主要介紹了ThinkPHP實(shí)現(xiàn)轉(zhuǎn)換數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)到對(duì)應(yīng)類型的方法,涉及thinkPHP模型類操作及針對(duì)源碼文件的相關(guān)修改方法,需要的朋友可以參考下2017-11-11
php中hashtable實(shí)現(xiàn)示例分享
對(duì)php內(nèi)核有一定了解的人應(yīng)該都知道php的精髓就是HashTable,這篇文章主要介紹了php中hashtable實(shí)現(xiàn)示例,需要的朋友可以參考下2014-02-02
php使用mkdir創(chuàng)建多級(jí)目錄入門例子
這篇文章主要介紹了php使用mkdir創(chuàng)建多級(jí)目錄入門例子,需要的朋友可以參考下2014-05-05

