前提明確:
一個表是排班表,一天有三個班,早中晚,對應三個時間段,
如早班:20200303 00:00:00 - 220303 07:29:59
中班:20200303 07:30:00-20200303 17:29:59
晚班:20200303 17:30:00 - 20200303 29:59:59;
另外一個表是工序時間表,有工序開始時間和結束時間,如 20200303 04:25:23 - 20200303 15:26:23
需求:
求出該工序所對應的班次,一個工序只能對應一個班,存在工序跨班的情況,如上述所例,若跨班存在,則比較在哪一個班的時間停留長,取該班次;
麻煩有思路或者會做的幫忙解決下用SQL怎么實作!
uj5u.com熱心網友回復:
直接執行這個陳述句,這里會回傳班次,和每個班次的時長,最后按照這個班次時長排序。WITH
"排班表" AS
(
SELECT '00:00:00' B,'07:29:59' E,'早班' T FROM DUAL UNION ALL
SELECT '07:30:00' B,'17:29:59' E,'中班' T FROM DUAL UNION ALL
SELECT '17:30:00' B,'23:59:59' E,'晚班' T FROM DUAL
),
"工序時間表" AS (SELECT '2020-03-03 04:25:23' B,'2020-03-03 15:26:23' E FROM DUAL ),
T3 AS (SELECT TO_DATE(T2.B,'YYYY-MM-DD HH24:MI:SS')+(LEVEL-1)/24/60/60 D FROM "工序時間表" T2 CONNECT BY LEVEL <=
(TO_DATE(T2.E,'YYYY-MM-DD HH24:MI:SS')-TO_DATE(T2.B,'YYYY-MM-DD HH24:MI:SS'))*24*60*60+1),
T4 AS (SELECT T3.*,T.T,TO_DATE(TO_CHAR(T3.D,'YYYY-MM-DD')||' '||T.B,'YYYY-MM-DD HH24:MI:SS') D1,
TO_DATE(TO_CHAR(T3.D,'YYYY-MM-DD')||' '||T.E,'YYYY-MM-DD HH24:MI:SS') D2 FROM T3 JOIN "排班表" T ON 1=1)
SELECT T "班次類別",SUM(
CASE WHEN D BETWEEN D1 AND D2 THEN 1 ELSE 0 END
) "班次時長(秒)" FROM T4 GROUP BY T ORDER BY 2 DESC
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/18079.html
標籤:高級技術
上一篇:Oracle debug進procedure的時候一直提示 not availible
下一篇:建立存盤程序,實作定時執行腳本!
