求助:修复Laravel查询以获取近7天每日用户平均使用时长
修复后的Laravel查询构造器代码(实现过去7天每日全体用户平均使用时长)
你现在的代码是计算单个用户的平均使用时长,但要实现过去7天内每日的全体用户平均使用时长,需要调整分组逻辑和日期范围,同时要先计算每个用户每日的平均时长,再聚合得到当日的全体用户平均值。以下是修复后的代码:
use Carbon\Carbon; // 定义时间范围:过去7天(包含今天) $endDate = Carbon::today(); $startDate = $endDate->copy()->subDays(7); // 第一步:子查询获取每个用户每日的平均使用时长 $dailyUserAvg = DB::table('active_user') ->select( DB::raw('DATE(acu_at) as date'), DB::raw('acu_name as user_email'), DB::raw('AVG(TIMESTAMPDIFF(MINUTE, acu_at, acu_et)) as user_daily_avg') ) ->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email') ->whereBetween('acu_at', [$startDate, $endDate]) ->groupBy('date', 'user_email'); // 第二步:基于子查询计算每日的全体用户平均时长 $dailyOverallAvg = DB::table($dailyUserAvg, 'daily_user_avg') ->select( 'date', DB::raw('AVG(user_daily_avg) as overall_average_time'), DB::raw('COUNT(DISTINCT user_email) as total_users') // 可选:当日活跃用户数 ) ->groupBy('date') ->orderBy('date') ->get();
关键修改点说明:
- 日期范围限定:用
whereBetween明确筛选过去7天的数据,避免只取到今天之前的所有历史数据 - 两级分组逻辑:
- 先按
日期+用户分组,计算每个用户当日的平均使用时长 - 再按
日期分组,计算当日所有用户平均时长的平均值,得到全体用户的当日平均
- 先按
- 日期格式化:用
DATE(acu_at)提取日期部分,确保按自然日维度分组统计 - 额外统计项:可选添加
total_users统计当日活跃用户数,辅助分析时长数据的参考维度
如果你需要的是当日所有会话的平均时长(而非用户级别的平均),可以简化为单级分组:
$dailySessionAvg = DB::table('active_user') ->select( DB::raw('DATE(acu_at) as date'), DB::raw('AVG(TIMESTAMPDIFF(MINUTE, acu_at, acu_et)) as session_average_time'), DB::raw('COUNT(*) as total_sessions'), DB::raw('COUNT(DISTINCT acu_name) as total_users') ) ->join('u_info_one', 'active_user.acu_name', '=', 'u_info_one.u_email') ->whereBetween('acu_at', [$startDate, $endDate]) ->groupBy('date') ->orderBy('date') ->get();
注意事项:
- 确保
acu_at字段是datetime类型,否则DATE()函数和日期筛选逻辑可能失效 - 如果你的“过去7天”需求是不包含今天(比如最近7个完整自然日),可以把
$endDate改为Carbon::yesterday()
内容的提问来源于stack exchange,提问作者Jerad
相关产品推荐
相关产品推荐

