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');
    })

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值