You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:53