ABAP算法题:拆分最小有效时间段

需求场景: 输入N个时间段,拆分成不重复的,最小时间段

例1, (20190101 - 20190105 ) + ( 20190103 - 20190107) => ( 20190101-20190103) + (20190104-20190105)+(20190106-20190107)

 思路分析:取得所有时间点,并划分最小范围,判断开始日期出于有效时间段内,并将结束日期+1 作为新的开始日期。

代码如下:

LOOP AT lt_euilzw INTO ls_euilzw.
  APPEND ls_euilzw-datefrom TO lt_date.
  APPEND ls_euilzw-dateto     TO lt_date.
ENDLOOP.

SORT lt_date.
DELETE ADJACENT DUPLICATES FROM lt_date.
CLEAR ls_euilzw-datefrom.
CLEAR ls_euilzw-dateto.

LOOP AT lt_date INTO DATA(ls_date).

  IF ls_euilzw-datefrom IS NOT INITIAL.
    LOOP AT lt_euilzw INTO DATA(ls_euilzw_q)
      WHERE datefrom =< ls_euilzw-datefrom
      AND dateto >= ls_euilzw-datefrom.
      EXIT.
    ENDLOOP.
    IF sy-subrc <> 0.
      CLEAR ls_euilzw-datefrom.
    ENDIF.

  ENDIF.

  IF ls_euilzw-datefrom IS INITIAL.
    ls_euilzw-datefrom = ls_date.
  ELSE.
    ls_euilzw-dateto = ls_date.
  ENDIF.

  IF ls_euilzw-datefrom = ls_euilzw-dateto.
    CLEAR ls_euilzw-dateto.
  ENDIF.

  IF ls_euilzw-dateto IS NOT INITIAL.
    APPEND ls_euilzw TO lt_euilzw_tmp.
    ls_euilzw-datefrom = ls_euilzw-dateto + 1.
    IF sy-subrc <> 0.
      CLEAR ls_euilzw-datefrom.
    ENDIF.
    CLEAR ls_euilzw-dateto.
  ENDIF.

ENDLOOP.

LOOP AT lt_euilzw_tmp INTO ls_euilzw.
  WRITE :/ ls_euilzw-datefrom ,ls_euilzw-dateto.
ENDLOOP.

 

转载于:https://www.cnblogs.com/yibing-jia/p/11275161.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值