本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法。分享给大家供大家参考,具体如下:
天(day): 格式Y-m-d
月(month):格式Y-m
年(year):格式Y
时间段(range): 格式Y-m-d
首先计算时间
天0-23小时
1
|
$rangeTime = range(0, 23); |
月:1-月底
1
2
3
4
|
// $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); $days = date ( "t" , strtotime ( $year . '-' . $month )); // 生成1-days的天 $rangeTime = range(1, $days ); |
年:1-12月
1
|
$rangeTime = range(1, 12); |
时间段;开始时间-结束时间
1
2
3
4
5
6
7
8
9
10
|
$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' ); } |
封装一下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
/** * 获取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 ]; } |
然后查询数据库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
$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(); |
按时间排列下
1
2
3
4
5
6
|
$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); } |
再按时间获取对应数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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; } } } |
封装下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/** * 时间段内支付订单量及金额 * 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 ; } |
前端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
<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> |
确认按钮
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$( '.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框架的PHP程序设计有所帮助。
原文链接:https://blog.csdn.net/tang05709/article/details/103803752