|
可以继续在我之前的SQL上加工, 也可以换另外一只, 先判断出连续的区间, 取出最大最小时间,计算耗时即可;
WITH TMP(D,
DATA_DATE,
START_TIME,
END_TIME) AS
(SELECT '001', '20170329', '7:30', '8:30'
FROM DUAL
UNION ALL
SELECT '001', '20170329', '8:00', '9:30'
FROM DUAL
UNION ALL
SELECT '001', '20170329', '8:20', '8:40'
FROM DUAL
UNION ALL
SELECT '001', '20170329', '10:15', '11:20'
FROM DUAL
UNION ALL
SELECT '001', '20170329', '10:40', '12:50'
FROM DUAL
UNION ALL
SELECT '001', '20170330', '7:40', '8:20'
FROM DUAL
UNION ALL
SELECT '001', '20170330', '8:13', '9:14'
FROM DUAL
UNION ALL
SELECT '001', '20170330', '8:20', '8:25'
FROM DUAL
UNION ALL
SELECT '001', '20170330', '10:15', '11:20'
FROM DUAL
UNION ALL
SELECT '001', '20170330', '10:40', '12:30'
FROM DUAL
UNION ALL
SELECT '002', '20170330', '7:15', '8:20'
FROM DUAL
UNION ALL
SELECT '002', '20170330', '8:13', '9:14'
FROM DUAL
UNION ALL
SELECT '002', '20170330', '8:20', '8:40'
FROM DUAL
UNION ALL
SELECT '002', '20170330', '10:15', '11:20'
FROM DUAL
UNION ALL
SELECT '002', '20170330', '10:40', '12:10'
FROM DUAL)
SELECT D, DATA_DATE, MIN(S) AS S, MAX(E) AS E,
(MAX(E) - MIN(S)) * 24 * 60 AS HF_TIME
FROM (SELECT D, DATA_DATE, S, E,
SUM(FLAG) OVER(PARTITION BY D, DATA_DATE ORDER BY S) FLAG
FROM (SELECT D, DATA_DATE, S, E,
CASE
WHEN S <= LAG(E)
OVER(PARTITION BY D, DATA_DATE ORDER BY S) THEN
0
ELSE
1
END FLAG
FROM (SELECT D, DATA_DATE,
TO_DATE(DATA_DATE || ' ' || START_TIME,
'YYYY-MM-DD HH24:MI') AS S,
TO_DATE(DATA_DATE || ' ' || END_TIME,
'YYYY-MM-DD HH24:MI') AS E
FROM TMP)))
GROUP BY D, DATA_DATE, FLAG
ORDER BY D, DATA_DATE, S
|
|