Application Development Blog Posts
Learn and share on deeper, cross technology development topics such as integration and connectivity, automation, cloud extensibility, developing at scale, and security.
cancel
Showing results for 
Search instead for 
Did you mean: 
jrgkraus
Active Contributor
After several times I encounterd the need for calculating the intersection of two time periods, I finally decided to create a reusable tool.

The tool not only decides wether two periods intersect or not (see also https://blogs.sap.com/tag/timeslice/) but returns also the intersection period. You can use it only with clocktime, dates or both.

Here's the class coding:
class zcl_tool_time_slices definition
public
create public .

public section.

types:
begin of ty_period,
date_from type d,
time_from type t,
date_to type d,
time_to type t,
end of ty_period .

class-methods intersect
importing
first_period type ty_period
second_period type ty_period
returning
value(r_intersect) type ty_period.
protected section.
private section.
ENDCLASS.



CLASS ZCL_TOOL_TIME_SLICES IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_TOOL_TIME_SLICES=>INTERSECT
* +-------------------------------------------------------------------------------------------------+
* | [--->] FIRST_PERIOD TYPE TY_PERIOD
* | [--->] SECOND_PERIOD TYPE TY_PERIOD
* | [<-()] R_INTERSECT TYPE TY_PERIOD
* +--------------------------------------------------------------------------------------</SIGNATURE>
method intersect.

r_intersect = cond #(
let
" concatenate date and time for easier comparison
first_from = first_period-date_from && first_period-time_from
second_from = second_period-date_from && second_period-time_from
first_to = first_period-date_to && first_period-time_to
second_to = second_period-date_to && second_period-time_to in
when
" very slim decision wether an intersection exists or not
first_from < second_to and
second_from < first_to
then value #(
let
from = cond #(
when first_from > second_from then first_from else second_from )
to = cond #(
when first_to > second_to then second_to else first_to ) in
date_from = from(8)
time_from = from+8
date_to = to(8)
time_to = to+8 ) ).

endmethod.
ENDCLASS.

You can play around with the class using this report
report zp_tmp_intersect.

parameters:
p1_datef type d, p1_timef type t, p1_datet type d, p1_timet type t,
p2_datef type d, p2_timef type t, p2_datet type d, p2_timet type t.

start-of-selection.
cl_demo_output=>display( zcl_tool_time_slices=>intersect(
first_period = value #(
date_from = p1_datef
time_from = p1_timef
date_to = p1_datet
time_to = p1_timet )
second_period = value #(
date_from = p2_datef
time_from = p2_timef
date_to = p2_datet
time_to = p2_timet ) ) ).

 

 
2 Comments