当前位置:   article > 正文

Oracle根据时间将一条记录进行分割成多条(开始时间与结束时间跨几天就分割成几条)_跨天切割时间,oracle

跨天切割时间,oracle

首先对需求进行一下说明:

假如我们A表里面有一条记录是这样的:

三个字段,第一个为MDN(号码),第二个为STARTTIME(开始时间),第三个为ENDTIME(结束时间)

现需要对表中所有这种开始时间与结束时间不在同一天的记录进行拆分,时间跨度几天就拆分成几条:

以上为实现后的效果图,由于之前对Oracle的游标不太了解,请教了组长,后来也仔细看了下

游标的使用,这个实现也并不难。主要是首先计算两个时间的跨度为几天,然后通过循环,将对应

的记录插入到另一张表中去。其中tableA是原始表,tableB是新表,v_d表示时间跨度的变量,其他变量

对应表字段。

  1. declare
  2. -- Local variables here
  3. v_startTime date;
  4. v_endTime date;
  5. v_mdn int;
  6. v2_startTime date;
  7. v2_endTime date;
  8. v_d int;
  9. cursor cr is
  10. select mdn,startTime,endTime from tableA
  11. where trunc(endTime,'dd') - trunc(startTime,'dd') > 0;
  12. begin
  13. -- Test statements here
  14. open cr;
  15. LOOP
  16. fetch cr into v_mdn,v_startTime,v_endTime;
  17. exit when cr%notfound;
  18. v_d :=trunc(v_endTime,'dd') - trunc(v_startTime,'dd') -1;
  19. dbms_output.put_line(v_d);
  20. insert into tableB values(v_mdn,trunc(v_endTime,'dd'),v_endTime);
  21. loop
  22. exit when v_d=0;
  23. v2_startTime := trunc(v_startTime,'dd') + v_d;
  24. dbms_output.put_line(to_char(v2_startTime,'yyyy-MM-dd'));
  25. v2_endTime := v2_startTime + 1;
  26. insert into tableB values(v_mdn,v2_startTime,v2_endTime);
  27. v_d:=v_d-1;
  28. end loop;
  29. insert into tableB values(v_mdn,v_startTime,trunc(v_startTime,'dd')+1);
  30. end loop;
  31. close cr;
  32. end;
  33. /


 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/188388
推荐阅读
相关标签
  

闽ICP备14008679号