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.

 

posted @ 2019-07-31 11:24  以秉  阅读(433)  评论(0编辑  收藏  举报