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