如何计算耗时?附订单数据表结构及样本数据
如何计算订单处理耗时?
看起来你需要计算订单的处理耗时,结合你给出的表结构和样本数据,我来一步步拆解怎么实现:
一、先理清楚字段含义
先把你提供的订单表字段对应含义梳理清楚,方便后续计算:
order_id:唯一标识一个订单(多条记录对应同一个订单)order_no:订单编号handle_time:处理时间(格式为yyyymmddhhmmss字符串)create_time:单条记录的创建时间(格式为yyyy/mm/dd hh:mm:ss字符串)update_time:单条记录的更新时间(同create_time格式)
二、场景1:计算整个订单的生命周期总耗时
如果要统计一个订单从首次创建到最后一次更新/处理的总耗时,可以通过分组订单ID,取最早的创建时间作为起点,最晚的更新时间作为终点,再计算时间差。下面是MySQL环境下的SQL示例:
SELECT order_id, order_no, -- 转换为标准datetime格式的订单首次创建时间 STR_TO_DATE(MIN(create_time), '%Y/%m/%d %H:%i:%s') AS order_start_time, -- 转换为标准datetime格式的订单最后更新时间 STR_TO_DATE(MAX(update_time), '%Y/%m/%d %H:%i:%s') AS order_end_time, -- 计算总耗时(分钟级) TIMESTAMPDIFF(MINUTE, STR_TO_DATE(MIN(create_time), '%Y/%m/%d %H:%i:%s'), STR_TO_DATE(MAX(update_time), '%Y/%m/%d %H:%i:%s')) AS total_minutes, -- 计算总耗时(秒级) TIMESTAMPDIFF(SECOND, STR_TO_DATE(MIN(create_time), '%Y/%m/%d %H:%i:%s'), STR_TO_DATE(MAX(update_time), '%Y/%m/%d %H:%i:%s')) AS total_seconds FROM your_order_table -- 替换成你的实际表名 GROUP BY order_id, order_no;
针对你提供的样本数据,order_id=3943的订单计算结果会是:
- 开始时间:2018/5/3 07:59:16
- 结束时间:2018/5/3 08:32:04
- 总耗时:约32分钟48秒
三、场景2:计算同订单内各次处理的间隔耗时
如果要查看同一个订单每次处理之间的时间间隔(比如第一次处理到第二次处理的耗时),可以用窗口函数LAG获取上一条记录的时间,再计算差值:
SELECT id, order_id, order_no, STR_TO_DATE(create_time, '%Y/%m/%d %H:%i:%s') AS current_process_time, -- 获取同订单的上一条记录的创建时间 LAG(STR_TO_DATE(create_time, '%Y/%m/%d %H:%i:%s')) OVER (PARTITION BY order_id ORDER BY create_time) AS previous_process_time, -- 计算当前处理与上一次处理的时间间隔(分钟级) TIMESTAMPDIFF(MINUTE, LAG(STR_TO_DATE(create_time, '%Y/%m/%d %H:%i:%s')) OVER (PARTITION BY order_id ORDER BY create_time), STR_TO_DATE(create_time, '%Y/%m/%d %H:%i:%s')) AS interval_minutes FROM your_order_table -- 替换成你的实际表名 ORDER BY order_id, create_time;
针对样本数据里的order_id=3943,计算结果会是:
- 第一条到第二条记录的间隔:22分钟
- 第二条到第三条记录的间隔:11分钟
四、扩展:按订单状态计算阶段耗时(如果后续有状态变更)
如果你的订单后续会有新建订单、处理中、已完成等状态,可以过滤对应状态的记录来计算特定阶段的耗时。比如计算从新建订单到已完成的耗时:
SELECT order_id, order_no, -- 取"新建订单"状态的最早时间 STR_TO_DATE(MIN(CASE WHEN order_status = '新建订单' THEN create_time END), '%Y/%m/%d %H:%i:%s') AS create_time, -- 取"已完成"状态的最晚时间 STR_TO_DATE(MAX(CASE WHEN order_status = '已完成' THEN update_time END), '%Y/%m/%d %H:%i:%s') AS finish_time, -- 计算阶段耗时 TIMESTAMPDIFF(MINUTE, STR_TO_DATE(MIN(CASE WHEN order_status = '新建订单' THEN create_time END), '%Y/%m/%d %H:%i:%s'), STR_TO_DATE(MAX(CASE WHEN order_status = '已完成' THEN update_time END), '%Y/%m/%d %H:%i:%s')) AS process_minutes FROM your_order_table GROUP BY order_id, order_no;
内容的提问来源于stack exchange,提问作者xiance sun




