我有两张表requisition_headers
和order_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; '草稿'
答案 0 :(得分:1)
确保您知道系统函数在使用时返回的内容。 TimestampDiff
函数返回您在第一个参数中指定的单位中两个日期之间的差异。你没有指定那个单位,所以我不知道你得到了什么。我收到编译错误。
在第二次尝试中,您使用TimeDiff
返回间隔值,然后将Avg
的结果转换为秒。因此,如果您希望在小数天内得到结果,只需除以一天中的秒数。
获取日期时也使用left join
。起初我以为你想得到订单是否已经创建的所有请购单。但是你是以错误的顺序加入表格的。但是,假设这是您的意图,如果尚未创建订单,您将把NULL
作为参数之一。您将获得一个NULL
作为答案,这样您什么都得不到。如果您想使用left join
,那么您应该为任何缺失的创建日期指定替代日期 - 在以正确的顺序获取表格之后,即。
以下是两个选项。一个人忽略了使用常规inner join
尚未创建的订单。另一个包括那些但替代当前日期和时间。
通过询问日期之间的分钟数,以天为单位的最终答案除以一天中的分钟数。
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;