SQL用于查找从多个重叠间隔开始经过的时间
|
不使用MSSQL或DB2或Oracle.
因此对于标识为id = 1的车辆 ID d1 d2
1 8/1 8/8
1 8/2 8/6
1 8/12 8/14
1 8/3 8/10
8/1 8/8
d1 d2
|-------------------------------|
8/2 8/6 8/12 8/14
d1 d2 d1 d2
|---------------| |----------|
8/3 8/10
d1 d2
|---------------------|
8/1 8/14
|---------------------------------------------------------| = 13 days
8/10 8/12
|--------------------------------------| + |----------| = parts hold = 11 days
从上面可以看出,开始工作的等待时间(假设为8/1) 解决方法这个SQL语句似乎得到了你想要的东西(t是样本表的表名):SELECT
d.id,d.duration,d.duration -
IFNULL(
( SELECT Sum( timestampdiff( SQL_TSI_DAY,no_hold.d2,( SELECT min(d1) FROM t t4
WHERE t4.id = no_hold.id and t4.d1 > no_hold.d2 )))
FROM ( SELECT DISTINCT id,d2 FROM t t1
WHERE ( SELECT sum( IIF( t1.d2 between t2.d1 and t2.d2,1,0 ) )
FROM t t2 WHERE t2.id = t1.id and t2.d2 <> t1.d2 ) = 0
And d2 <> ( select max( d2 ) from t t3 where t3.id = t1.id )) no_hold
WHERE no_hold.id = d.id ),0 ) "parts hold"
FROM
( SELECT id,timestampdiff( SQL_TSI_DAY,min( d1 ),max( d2 ) ) duration
FROM t GROUP BY id ) d
外部查询获取修复工作的持续时间.复杂子查询计算不等待零件的总天数.这是通过找到车辆没有等待零件的开始日期来完成的,然后计算它开始等待零件的天数: // 1) The query for finding the starting dates when the vehicle is not waiting for parts,// i.e. finding all d2 that is not within any date range where the vehicle is waiting for part.
// The DISTINCT is needed to removed duplicate starting "no hold" period.
SELECT DISTINCT id,d2
FROM t t1
WHERE ( SELECT sum( IIF( t1.d2 between t2.d1 and t2.d2,0 ) ) from t t2
WHERE t2.id = t1.id and t2.d2 <> t1.d2 ) = 0 AND
d2 <> ( SELECT max( d2 ) FROM t t3 WHERE t3.id = t1.id ) )
// 2)车辆没有等待零件的日期是从上述查询到车辆//再次等待零件的日期 timestampdiff( SQL_TSI_DAY,( SELECT min(d1) FROM t t4 WHERE t4.id = no_hold.id and t4.d1 > no_hold.d2 ) ) 将上述两者结合起来并汇总所有这些时期,可以得出车辆不等待零件的天数.最终查询添加了一个额外条件来计算外部查询中每个id的结果. 在具有许多ID的非常大的表上,这可能不是非常有效.如果id被限制为一个或几个,它应该很好. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
