Laravel中如何基于updated_at字段计算已交付订单的平均配送时长?
计算已交付订单的平均配送时长方案
嘿,这个问题我熟!要算出已交付订单的平均配送时长,核心就是先得到每个订单从「配送起始时间」到「交付完成时间(updated_at)」的时间差,再取平均值就行。我给你两种实用方案,按需选择:
方案一:数据库层面计算(推荐,效率更高)
直接让数据库帮我们计算并取平均值,数据量大的时候这个方法性能更好,不用把所有订单数据拉到PHP里处理。
MySQL 版本
用MySQL的TIMESTAMPDIFF函数计算时间差,你可以根据需求调整时间单位(比如HOUR小时、MINUTE分钟、DAY天):
// 计算平均配送时长(单位:小时) $averageDeliveryTime = Order::where('status', '8') ->selectRaw('AVG(TIMESTAMPDIFF(HOUR, created_at, updated_at)) as avg_delivery_hours') ->value('avg_delivery_hours');
PostgreSQL 版本
如果用的是PostgreSQL,换成AGE和EXTRACT函数:
// 计算平均配送时长(单位:小时) $averageDeliveryTime = Order::where('status', '8') ->selectRaw('AVG(EXTRACT(HOUR FROM AGE(updated_at, created_at))) as avg_delivery_hours') ->value('avg_delivery_hours');
方案二:PHP集合层面计算
如果需要对每个订单的配送时长做额外逻辑处理(比如过滤异常时长),可以先拉取所有已交付订单,再用Laravel集合计算:
// 获取所有已交付订单 $deliveredOrders = Order::where('status', '8')->get(); // 计算平均配送时长(单位:小时,也可以用diffInMinutes/diffInDays等) $averageDeliveryTime = $deliveredOrders->map(function ($order) { // 这里可以加额外逻辑,比如跳过时长超过72小时的异常订单 $hours = $order->created_at->diffInHours($order->updated_at); return $hours <= 72 ? $hours : null; })->avg(); // avg()会自动忽略null值
敲黑板:如果你的配送时长起始时间不是下单时间(created_at),而是发货时间(比如shipped_at)这类其他字段,直接把代码里的created_at换成对应的字段就可以啦!
内容的提问来源于stack exchange,提问作者Jadasdas
相关产品推荐
相关产品推荐

