关于工序跨班写成SQL实现的问题

会飞的DJI 2020-03-03 05:05:40
前提明确:
一个表是排班表,一天有三个班,早中晚,对应三个时间段,
如早班: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怎么实现!
...全文
156 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
会飞的DJI 2020-12-14
  • 打赏
  • 举报
回复
谢谢 这个很强
AHUA1001 2020-03-05
  • 打赏
  • 举报
回复
直接执行这个语句,这里会返回班次,和每个班次的时长,最后按照这个班次时长排序。

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

3,492

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧