You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何计算耗时?附订单数据表结构及样本数据

如何计算订单处理耗时?

看起来你需要计算订单的处理耗时,结合你给出的表结构和样本数据,我来一步步拆解怎么实现:

一、先理清楚字段含义

先把你提供的订单表字段对应含义梳理清楚,方便后续计算:

  • 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

火山引擎 最新活动