查找从“已提交订单”到“已创建订单”的平均时间

时间:2015-04-21 18:32:41

标签: mysql

我有两张表requisition_headersorder_headers。我有兴趣查找从提交请购单(requisition_headers.submitted_at)到创建订单的时间(orders.headers_created_at)所需的平均时间requisition_headers.status <> 'draft'

我希望结果如下:

Avg_Req_To_PO_Cycle_Time = 3.2 Days

我有以下脚本,但它不起作用:

SELECT Database() as Customer,
       AVG(timestampdiff(requisition_headers.submitted_at,order_headers.created_at)) AS REQ_PO_Cycle_Time
  FROM order_headers 
  LEFT JOIN requisition_headers ON order_headers.requisition_header_id = requisition_headers.id
 WHERE requisition_headers.status <> 'draft'

任何想法?

- UPDATE -

我将查询更改为以下内容,现在得到229491.71的回复,我的问题是天,小时,分钟,秒?

SELECT DATABASE() AS CUSTOMER,
AVG(TIME_TO_SEC(TIMEDIFF(order_headers.created_at,requisition_headers.submitted_at))) as Cycle_time
FROM order_headers LEFT JOIN requisition_headers ON order_headers.requisition_header_id = requisition_headers.id

其中requisition_headers.status&lt;&gt; '草稿'

1 个答案:

答案 0 :(得分:1)

确保您知道系统函数在使用时返回的内容。 TimestampDiff函数返回您在第一个参数中指定的单位中两个日期之间的差异。你没有指定那个单位,所以我不知道你得到了什么。我收到编译错误。

在第二次尝试中,您使用TimeDiff返回间隔值,然后将Avg的结果转换为秒。因此,如果您希望在小数天内得到结果,只需除以一天中的秒数。

获取日期时也使用left join。起初我以为你想得到订单是否已经创建的所有请购单。但是你是以错误的顺序加入表格的。但是,假设这是您的意图,如果尚未创建订单,您将把NULL作为参数之一。您将获得一个NULL作为答案,这样您什么都得不到。如果您想使用left join,那么您应该为任何缺失的创建日期指定替代日期 - 在以正确的顺序获取表格之后,即。

以下是两个选项。一个人忽略了使用常规inner join尚未创建的订单。另一个包括那些但替代当前日期和时间。

通过询问日期之间的分钟数,以天为单位的最终答案除以一天中的分钟数。

SQLFiddle

SELECT  Customer,
        AVG( timestampdiff( minute, r.submitted_at,
             o.created_at)) / (24 * 60 )AS REQ_PO_Cycle_Time
FROM    requisition_headers r
JOIN    order_headers o
    ON  o.requisition_header_id = r.id
WHERE   r.status <> 'draft'
group by Customer;

SELECT  Customer,
        AVG( timestampdiff( minute, r.submitted_at,
             IfNull( o.created_at, CurDate()))) / (24 * 60 )AS REQ_PO_Cycle_Time
FROM    requisition_headers r
LEFT JOIN order_headers o
    ON  o.requisition_header_id = r.id
WHERE   r.status <> 'draft'
group by Customer;