需求场景: 输入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.