<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956386#M373469</link>
    <description>Here are two solutions:&lt;BR /&gt;1)since all the time part of datetime is 0 ,you could just use date part like:&lt;BR /&gt;START_TS=datepart(START_TS);&lt;BR /&gt; END_TS=datepart(END_TS);&lt;BR /&gt;before running my code.&lt;BR /&gt;&lt;BR /&gt;2) you could split your big table into many small dateset and make a marco to run my code  and combine them together after running my code.&lt;BR /&gt;Like:&lt;BR /&gt;data part11;&lt;BR /&gt; set dataset1;&lt;BR /&gt;if id in ('A' 'B' 'C' 'D');&lt;BR /&gt;run;&lt;BR /&gt;data part12;&lt;BR /&gt; set dataset2;&lt;BR /&gt;if pt in ('A' 'B' 'C' 'D');&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;and running my code.</description>
    <pubDate>Fri, 17 Jan 2025 03:03:53 GMT</pubDate>
    <dc:creator>Ksharp</dc:creator>
    <dc:date>2025-01-17T03:03:53Z</dc:date>
    <item>
      <title>How to create a dataset with merged time intervals from 2 datasets each with time interval and value</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956332#M373455</link>
      <description>&lt;P&gt;I have two datasets, each with an ID, START_TS, END_TS, and a Value. I want to merge these two and create a merged time intervals, and replace the original Value from dataset 1 with the Value from dataset 2.&amp;nbsp;The logic should involve overlaying the values from &lt;CODE&gt;dataset2&lt;/CODE&gt; onto &lt;CODE&gt;dataset1&lt;/CODE&gt; where the time intervals from &lt;CODE&gt;dataset2&lt;/CODE&gt; exist, while maintaining the original &lt;CODE&gt;dataset1&lt;/CODE&gt; values for non-overlapping intervals.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;data dataset1;&lt;BR /&gt;format START_TS END_TS datetime20.;&lt;BR /&gt;input OBS ID $ START_TS :datetime. END_TS :datetime. Value;&lt;BR /&gt;datalines;&lt;BR /&gt;1 A 01JAN2025:00:00:00 02JAN2025:00:00:00 10&lt;BR /&gt;2 A 02JAN2025:00:00:00 03JAN2025:00:00:00 20&lt;BR /&gt;3 A 03JAN2025:00:00:00 04JAN2025:00:00:00 10&lt;BR /&gt;4 A 04JAN2025:00:00:00 05JAN2025:00:00:00 20&lt;BR /&gt;5 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10&lt;BR /&gt;6 A 06JAN2025:00:00:00 07JAN2025:00:00:00 20&lt;BR /&gt;;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;data dataset2;&lt;BR /&gt;format START_TS END_TS datetime20.;&lt;BR /&gt;input OBS PT $ START_TS :datetime. END_TS :datetime. Value;&lt;BR /&gt;datalines;&lt;BR /&gt;1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99&lt;BR /&gt;2 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99&lt;BR /&gt;3 A 03JAN2025:22:00:00 04JAN2025:02:00:00 99&lt;BR /&gt;4 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99&lt;BR /&gt;5 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99&lt;BR /&gt;;&lt;BR /&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dataset wanted:&lt;/STRONG&gt;&lt;BR /&gt;ID PT START_TS END_TS Updated_Value&lt;BR /&gt;1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99&lt;BR /&gt;2 A 01JAN2025:10:00:00 02JAN2025:00:00:00 10&lt;BR /&gt;3 A 02JAN2025:00:00:00 02JAN2025:08:00:00 20&lt;BR /&gt;4 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99&lt;BR /&gt;5 A 02JAN2025:11:00:00 03JAN2025:00:00:00 20&lt;BR /&gt;6 A 03JAN2025:00:00:00 03JAN2025:22:00:00 10&lt;BR /&gt;7 A 03JAN2025:22:00:00 04JAN2025:00:00:00 99&lt;BR /&gt;8 A 04JAN2025:00:00:00 04JAN2025:02:00:00 99&lt;BR /&gt;9 A 04JAN2025:02:00:00 05JAN2025:00:00:00 20&lt;BR /&gt;10 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10&lt;BR /&gt;11 A 06JAN2025:00:00:00 06JAN2025:03:00:00 20&lt;BR /&gt;12 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99&lt;BR /&gt;13 A 06JAN2025:05:00:00 06JAN2025:23:00:00 20&lt;BR /&gt;14 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99&lt;BR /&gt;&lt;BR /&gt;&lt;STRONG&gt;My code is below. It mostly works, but does not handle multiple time intervals on the same day from dataset 2 (OBS 4 and 5) correctly. Please help!&lt;/STRONG&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;*Expand dataset1 into daily intervals;&lt;/DIV&gt;
&lt;DIV&gt;data expanded_dataset2;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; set dataset2;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; format daily_start daily_end datetime20.;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Split dataset1 into daily intervals */&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; if not missing(START_TS) and not missing(END_TS) then do;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; &amp;nbsp; &amp;nbsp; do date = DATEPART(START_TS) to DATEPART(END_TS);&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; daily_start = max(START_TS, dhms(date, 0, 0, 0));&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; daily_end = min(END_TS, dhms(date+1, 0, 0, 0));&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; &amp;nbsp; &amp;nbsp; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; end;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; keep ID daily_start daily_end Value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; rename daily_start = START_TS daily_end = END_TS;&lt;/DIV&gt;
&lt;DIV&gt;run;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;*Merge and handle overlaps;&lt;/DIV&gt;
&lt;DIV&gt;proc sql;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; create table merged_intervals as&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; select a.ID,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.START_TS as Base_START_TS,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.END_TS as Base_END_TS,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.START_TS as Overlay_START_TS,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.END_TS as Overlay_END_TS,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.Value as Base_Value,&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Value as Overlay_Value&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; from dataset1 as a&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; left join expanded_dataset2 as b&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; on a.ID = b.ID and&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.END_TS &amp;gt; a.START_TS and&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.START_TS &amp;lt; a.END_TS&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt; order by a.ID, a.START_TS, b.START_TS;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;quit;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;*Split and prioritize intervals;&lt;/DIV&gt;
&lt;DIV&gt;data final_intervals;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; set merged_intervals;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Interval 1: Before the overlap */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. and Base_START_TS &amp;lt; Overlay_START_TS then do;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Base_START_TS;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Overlay_START_TS);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; end;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Interval 2: During the overlap */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. then do;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = max(Base_START_TS, Overlay_START_TS);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Overlay_END_TS);&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Overlay_Value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; end;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* Interval 3: After the overlap */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. and Base_END_TS &amp;gt; Overlay_END_TS then do;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Overlay_END_TS;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = Base_END_TS;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; end;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; /* If no overlay exists, keep original interval */&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; if Overlay_START_TS =. then do;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Base_START_TS;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = Base_END_TS;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; end;&lt;/DIV&gt;
&lt;DIV&gt;run;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;* Remove duplicates and sort;&lt;/DIV&gt;
&lt;DIV&gt;proc sort data=final_intervals nodupkey;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp; &amp;nbsp; by ID START_TS END_TS;&lt;/DIV&gt;
&lt;DIV&gt;run;&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Thu, 16 Jan 2025 17:31:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956332#M373455</guid>
      <dc:creator>lingcx</dc:creator>
      <dc:date>2025-01-16T17:31:24Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956381#M373466</link>
      <description>&lt;P&gt;CODE EDITED:&lt;/P&gt;
&lt;PRE&gt;data dataset1;
format START_TS END_TS datetime20.;
input OBS ID $ START_TS :datetime. END_TS :datetime. Value;
datalines;
1 A 01JAN2025:00:00:00 02JAN2025:00:00:00 10
2 A 02JAN2025:00:00:00 03JAN2025:00:00:00 20
3 A 03JAN2025:00:00:00 04JAN2025:00:00:00 10
4 A 04JAN2025:00:00:00 05JAN2025:00:00:00 20
5 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10
6 A 06JAN2025:00:00:00 07JAN2025:00:00:00 20
;
run;

 

data dataset2;
format START_TS END_TS datetime20.;
input OBS PT $ START_TS :datetime. END_TS :datetime. Value;
datalines;
1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99
2 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99
3 A 03JAN2025:22:00:00 04JAN2025:02:00:00 99
4 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99
5 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99
;
run;

data temp1;
 set dataset1;
 do dt= START_TS to END_TS;
  output;
 end;
 keep id dt value;
 format dt datetime20.;
run;

data temp2;
 set dataset2;
 do dt= START_TS to END_TS;
  output;
 end;
 keep pt dt value;
 format dt datetime20.;
run;

data temp3;
 merge temp1 temp2(rename=(pt=id &lt;STRONG&gt;value=_value&lt;/STRONG&gt;));
 by id dt;
 &lt;STRONG&gt;new_value=coalesce(_value,value);&lt;/STRONG&gt;
run;
proc summary data=temp3;
by id &lt;STRONG&gt;new_value&lt;/STRONG&gt; notsorted;
var dt;
output out=want(drop=_:) min=start_ts max=end_ts;
run;&lt;/PRE&gt;</description>
      <pubDate>Fri, 17 Jan 2025 03:28:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956381#M373466</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-01-17T03:28:37Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956383#M373467</link>
      <description>&lt;P&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;Thanks for your solution! Your code inspired me. The only issue is that I only showed a small sample dataset here. My real datasets have more than 20K days, so I believe SAS couldn't handle long formats in seconds (&amp;gt;20000x24x60x60) very well... Any thoughts?&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Jan 2025 02:50:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956383#M373467</guid>
      <dc:creator>lingcx</dc:creator>
      <dc:date>2025-01-17T02:50:09Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956385#M373468</link>
      <description>&lt;P&gt;This would be more manageable if you had the DATE of start_ts (which is a &lt;EM&gt;&lt;STRONG&gt;datetime&lt;/STRONG&gt;&lt;/EM&gt; value).&amp;nbsp; Then it is more trivial to propagate value to the beginning or end of a date.&amp;nbsp; So I made a VIEW of dataset1 and dataset2, with a new DATE variable.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Building NEED2, the view derived from DATASET2, each observation is not only copied, but all "holes" are also output, with appropriate START_DS and END_DS, and VALUE set to missing.&amp;nbsp; &amp;nbsp;"Filling holes" means not only between observations, but also start-of-day and end-of-day time spans not covered in the dataset2 observation.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data dataset1;
  input OBS ID $ START_TS :datetime. END_TS :datetime. Value;
  format start_ts end_ts datetime20.;
datalines;
1 A 01JAN2025:00:00:00 02JAN2025:00:00:00 10
2 A 02JAN2025:00:00:00 03JAN2025:00:00:00 20
3 A 03JAN2025:00:00:00 04JAN2025:00:00:00 10
4 A 04JAN2025:00:00:00 05JAN2025:00:00:00 20
5 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10
6 A 06JAN2025:00:00:00 07JAN2025:00:00:00 20
run;

data dataset2;
  input OBS ID $ START_TS :datetime. END_TS :datetime. Value;
  format START_TS END_TS datetime20.;
datalines;
1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99
2 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99
3 A 03JAN2025:22:00:00 04JAN2025:02:00:00 99
4 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99
5 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99
run;

data need2 (drop=_: obs) /view=need2  ;
  set dataset2 ;
  by ID;

  /* When starting new day or new ID, check if dummy starting record is needed */
  if first.ID=1 or dif(datepart(start_ts))&amp;gt;0 then do;
    if timepart(start_ts) ^= '00:00:00't then do; /* Yes, a Dummy rec is needed*/
      end_ts=start_ts;
      start_ts=intnx('dtday',start_ts,0,'begin');
      date=datepart(start_ts);
      _value=value;
      call missing(value);
      output;
      value=_value;
    end;
  end;

  merge dataset2  /*Reread the same obs, to recover VALUE*/
        dataset2 (firstobs=2 keep=id start_ts rename=(id=_nxt_id start_ts=_nxt_st)) ;

  _orig_end=end_ts;
  do until (start_ts=_orig_end);
    date=datepart(start_ts);
    end_ts=min(_orig_end,intnx('dtday',start_ts,1,'begin'));
    output;
    start_ts=end_ts;
  end;

  /* Most obs will need a trailing dummy record */
  if timepart(end_ts)^='00:00:00't then do;
    start_ts=end_ts;
    end_ts=_nxt_st;
    if last.ID or datepart(_nxt_st)^=datepart(start_ts) then end_ts=intnx('dtday',start_ts,1,'begin');
    call missing(value); 
    date=datepart(start_ts);
    output;
  end;
  format date date9. ;
run;

data need1 (drop=obs)/view=need1;
  set dataset1;
  date=datepart(start_ts);
  format date date9. ;
run;

data want (drop=_:);
  set need1 (in=in1)  need2 (in=in2);
  by ID date;
  retain _value;
  if first.date=1 and last.date=1 then output;
  else if in1 then _value=value;
  else if in2 then do;
    value=coalesce(value,_value);
    output;
  end; 
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 17 Jan 2025 03:01:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956385#M373468</guid>
      <dc:creator>mkeintz</dc:creator>
      <dc:date>2025-01-17T03:01:39Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956386#M373469</link>
      <description>Here are two solutions:&lt;BR /&gt;1)since all the time part of datetime is 0 ,you could just use date part like:&lt;BR /&gt;START_TS=datepart(START_TS);&lt;BR /&gt; END_TS=datepart(END_TS);&lt;BR /&gt;before running my code.&lt;BR /&gt;&lt;BR /&gt;2) you could split your big table into many small dateset and make a marco to run my code  and combine them together after running my code.&lt;BR /&gt;Like:&lt;BR /&gt;data part11;&lt;BR /&gt; set dataset1;&lt;BR /&gt;if id in ('A' 'B' 'C' 'D');&lt;BR /&gt;run;&lt;BR /&gt;data part12;&lt;BR /&gt; set dataset2;&lt;BR /&gt;if pt in ('A' 'B' 'C' 'D');&lt;BR /&gt;run;&lt;BR /&gt;&lt;BR /&gt;and running my code.</description>
      <pubDate>Fri, 17 Jan 2025 03:03:53 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956386#M373469</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-01-17T03:03:53Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956387#M373470</link>
      <description>&lt;P&gt;Here is the third solution:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;data dataset1;
format START_TS END_TS datetime20.;
input OBS ID $ START_TS :datetime. END_TS :datetime. Value;
datalines;
1 A 01JAN2025:00:00:00 02JAN2025:00:00:00 10
2 A 02JAN2025:00:00:00 03JAN2025:00:00:00 20
3 A 03JAN2025:00:00:00 04JAN2025:00:00:00 10
4 A 04JAN2025:00:00:00 05JAN2025:00:00:00 20
5 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10
6 A 06JAN2025:00:00:00 07JAN2025:00:00:00 20
;
run;

 

data dataset2;
format START_TS END_TS datetime20.;
input OBS PT $ START_TS :datetime. END_TS :datetime. Value;
datalines;
1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99
2 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99
3 A 03JAN2025:22:00:00 04JAN2025:02:00:00 99
4 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99
5 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99
;
run;

data temp1;
 set dataset1;
 do dt= START_TS to END_TS;
  output;
 end;
 keep id dt value;
 format dt datetime20.;
run;

data temp2;
 set dataset2;
 do dt= START_TS to END_TS;
  output;
 end;
 keep pt dt value;
 format dt datetime20.;
run;

&lt;FONT color="#FF0000"&gt;&lt;STRONG&gt;data temp3;
 set temp1 temp2(rename=(pt=id));
 by id dt;
 if last.dt;
run;&lt;/STRONG&gt;&lt;/FONT&gt;


proc summary data=temp3;
by id value notsorted;
var dt;
output out=want(drop=_:) min=start_ts max=end_ts;
run;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Jan 2025 03:34:51 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956387#M373470</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-01-17T03:34:51Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956388#M373471</link>
      <description>That is about 1.7 billion obs ,not too many for sas I think.&lt;BR /&gt;&lt;BR /&gt;Why not try it(my third code) and  check if sas could handle this big table or not ?</description>
      <pubDate>Fri, 17 Jan 2025 03:39:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956388#M373471</guid>
      <dc:creator>Ksharp</dc:creator>
      <dc:date>2025-01-17T03:39:25Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956406#M373478</link>
      <description>&lt;P&gt;No need to recreate every possible time slice. Using the existing ones should be enough.&lt;/P&gt;
&lt;P&gt;This seems to work.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data DATASET1;
format START_TS END_TS datetime20.;
input OBS ID $ START_TS :datetime. END_TS :datetime. VALUE;
datalines;
1 A 01JAN2025:00:00:00 02JAN2025:00:00:00 10
2 A 02JAN2025:00:00:00 03JAN2025:00:00:00 20
3 A 03JAN2025:00:00:00 04JAN2025:00:00:00 10
4 A 04JAN2025:00:00:00 05JAN2025:00:00:00 20
5 A 05JAN2025:00:00:00 06JAN2025:00:00:00 10
6 A 06JAN2025:00:00:00 07JAN2025:00:00:00 20
run;

data DATASET2;
  format START_TS END_TS datetime20.;
  input OBS PT $ START_TS :datetime. END_TS :datetime. VALUE;
datalines;
1 A 01JAN2025:00:00:00 01JAN2025:10:00:00 99
2 A 02JAN2025:08:00:00 02JAN2025:11:00:00 99
3 A 03JAN2025:22:00:00 04JAN2025:02:00:00 99
4 A 06JAN2025:03:00:00 06JAN2025:05:00:00 99
5 A 06JAN2025:23:00:00 07JAN2025:00:00:00 99
run;
       
proc sql ;
  create table PERIODS_START as
  select unique START_TS , monotonic() as AA from 
   (select START_TS from DATASET2
    union
    select END_TS   from DATASET2
    union
    select START_TS-timepart(START_TS) from DATASET2
    union
    select END_TS  -timepart(END_TS  ) from DATASET2
    union
    select intnx('dtday', START_TS, 1, 'b') from DATASET2
    union
    select intnx('dtday', END_TS  , 1, 'b') from DATASET2)
  order by START_TS;  
quit;

data PERIODS_START_END; 
  merge PERIODS_START 
        PERIODS_START(firstobs=2 rename=(START_TS=END_TS));
  if END_TS;      
run;
 
proc sql; 
   select b.START_TS
        , b.END_TS
        , coalesce(c.VALUE, a.VALUE) as VALUE
   from DATASET1          a
          left join
        PERIODS_START_END b
          on a.START_TS &amp;lt;= b.START_TS &amp;lt; a.END_TS                  
          left join
        DATASET2          c
          on  b.START_TS between c.START_TS and c.END_TS                   
          and b.END_TS   between c.START_TS and c.END_TS                   
  order by 1;
quit;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="ChrisNZ_0-1737110337521.png" style="width: 400px;"&gt;&lt;img src="https://communities.sas.com/t5/image/serverpage/image-id/103769i9FD1200CDC889F01/image-size/medium?v=v2&amp;amp;px=400" role="button" title="ChrisNZ_0-1737110337521.png" alt="ChrisNZ_0-1737110337521.png" /&gt;&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Jan 2025 10:39:09 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956406#M373478</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2025-01-17T10:39:09Z</dc:date>
    </item>
    <item>
      <title>Re: How to create a dataset with merged time intervals from 2 datasets each with time interval and v</title>
      <link>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956430#M373488</link>
      <description>&lt;P&gt;Thanks to all of you &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/18408"&gt;@Ksharp&lt;/a&gt;&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/16961"&gt;@ChrisNZ&lt;/a&gt;&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/31461"&gt;@mkeintz&lt;/a&gt;&amp;nbsp;who provided suggestions! Appreciate your time! &lt;BR /&gt;I should have clarified that my real datasets do have HH:MM:SS values (in fact dataset2 TS rarely ends with 00:00:00) - I just didn't make those in my dummy ones. Also my dataset1 doesn't span days, but my dataset 2 potentially does. &lt;BR /&gt;&lt;BR /&gt;I finally wrote up my own code with more complicated test datasets, with the help of ChatGPT...&amp;nbsp;This is what I got. The code is long but it seems to work for now. If you have better solutions, let me know! Thank you!&lt;/P&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;/* Step 1: Create sample data */
data dataset1;
&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;
&amp;nbsp; &amp;nbsp; input ID $ START_TS :datetime. END_TS :datetime. Value;
&amp;nbsp; &amp;nbsp; datalines;
A 01JAN2025:00:00:00 01JAN2025:06:00:11 10
A 01JAN2025:06:00:11 01JAN2025:16:22:33 20
A 01JAN2025:16:22:33 02JAN2025:00:00:00 10
A 02JAN2025:00:00:00 03JAN2025:00:00:00 20
A 03JAN2025:00:00:00 04JAN2025:00:00:00 10
A 04JAN2025:00:00:00 05JAN2025:00:00:00 20
A 05JAN2025:00:00:00 06JAN2025:00:00:00 10
A 06JAN2025:00:00:00 07JAN2025:00:00:00 20
B 01JAN2025:00:00:00 01JAN2025:06:44:11 10
B 01JAN2025:14:33:22 01JAN2025:16:51:23 20
B 01JAN2025:18:18:18 02JAN2025:00:00:00 10
B 02JAN2025:00:00:00 02JAN2025:15:23:04 20
;
run;

data dataset2;
&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;
&amp;nbsp; &amp;nbsp; input ID $ START_TS :datetime. END_TS :datetime. Value;
&amp;nbsp; &amp;nbsp; datalines;
A 01JAN2025:00:00:00 01JAN2025:10:00:00 99
A 02JAN2025:08:00:00 04JAN2025:02:00:00 99
A 04JAN2025:15:00:00 04JAN2025:17:00:00 99
A 04JAN2025:22:00:00 04JAN2025:23:00:00 99
A 06JAN2025:03:00:00 06JAN2025:05:00:00 99
A 06JAN2025:23:00:00 07JAN2025:00:00:00 99
B 01JAN2025:00:00:00 01JAN2025:10:00:00 99
B 01JAN2025:15:00:00 01JAN2025:19:00:00 99
B 02JAN2025:08:00:00 04JAN2025:02:00:00 99
;
run;

/* Step 2: Adjust dataset1 intervals (if necessary) */
/*data adjusted_dataset1;*/
/*&amp;nbsp; &amp;nbsp; set dataset1;*/
/*&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;*/
/*run;*/

/* Step 3: Expand dataset2 into daily intervals */
data expanded_dataset2;
&amp;nbsp; &amp;nbsp; set dataset2;
&amp;nbsp; &amp;nbsp; format daily_start daily_end datetime20.;

&amp;nbsp; &amp;nbsp; /* Split dataset2 into daily intervals */
if not missing(START_TS) and not missing(END_TS) then do;

&amp;nbsp; &amp;nbsp; do date = DATEPART(START_TS) to DATEPART(END_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; daily_start = max(START_TS, dhms(date, 0, 0, 0));
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; daily_end = min(END_TS, dhms(date+1, 0, 0, 0));
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;
end;

&amp;nbsp; &amp;nbsp; keep ID daily_start daily_end Value;
&amp;nbsp; &amp;nbsp; rename daily_start = START_TS daily_end = END_TS;
run;


/* Step 4: Merge and handle overlaps */
proc sql;
&amp;nbsp; &amp;nbsp; create table merged_intervals as
&amp;nbsp; &amp;nbsp; select a.ID,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.START_TS as Base_START_TS,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.END_TS as Base_END_TS,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.START_TS as Overlay_START_TS,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.END_TS as Overlay_END_TS,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.Value as Base_Value,&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.Value as Overlay_Value
&amp;nbsp; &amp;nbsp; from dataset1 as a
&amp;nbsp; &amp;nbsp; left join expanded_dataset2 as b
&amp;nbsp; &amp;nbsp; on a.ID = b.ID and&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.END_TS &amp;gt; a.START_TS and&amp;nbsp;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.START_TS &amp;lt; a.END_TS
order by a.ID, a.START_TS, b.START_TS;
quit;

data merged_intervals1;
set merged_intervals;
Lag_Overlay_END_TS = lag(Overlay_END_TS);
Lag_ID1 = lag(ID);
If ID^= Lag_ID1 or DATEPART(Lag_Overlay_END_TS) ^= DATEPART(Overlay_START_TS) then Lag_Overlay_END_TS = .;
format Lag_Overlay_END_TS datetime20.;
run;
Proc sort data=merged_intervals1; by ID descending Base_START_TS descending Overlay_START_TS; run;

data merged_intervals2;
set merged_intervals1;
Lag_Overlay_START_TS = lag(Overlay_START_TS);
Lag_ID2 = lag(ID);
If ID^= Lag_ID2 or DATEPART(Lag_Overlay_START_TS) ^= DATEPART(Overlay_END_TS) then Lag_Overlay_START_TS = .;
format Lag_Overlay_START_TS datetime20.;
run;
Proc sort data=merged_intervals2; by ID Base_START_TS Overlay_START_TS; run;

/* Step 5: Split and prioritize intervals */
data final_intervals;
&amp;nbsp; &amp;nbsp; set merged_intervals2;
&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;

&amp;nbsp; &amp;nbsp; /* Interval 1: Before the overlap */
&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. and Base_START_TS &amp;lt; Overlay_START_TS and Lag_Overlay_END_TS ^= . then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = max(Base_START_TS, Lag_Overlay_END_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Overlay_START_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;
if Overlay_START_TS ^=. and Base_START_TS &amp;lt; Overlay_START_TS and Lag_Overlay_END_TS = . then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Base_START_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Overlay_START_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;

&amp;nbsp; &amp;nbsp; /* Interval 2: During the overlap */
&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = max(Base_START_TS, Overlay_START_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Overlay_END_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Overlay_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;

&amp;nbsp; &amp;nbsp; /* Interval 3: After the overlap */
&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. and Base_END_TS &amp;gt; Overlay_END_TS and Lag_Overlay_START_TS ^= . then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Overlay_END_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = min(Base_END_TS, Lag_Overlay_START_TS);
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;
&amp;nbsp; &amp;nbsp; if Overlay_START_TS ^=. and Base_END_TS &amp;gt; Overlay_END_TS and Lag_Overlay_START_TS = . then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Overlay_END_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = Base_END_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;

&amp;nbsp; &amp;nbsp; /* If no overlay exists, keep original interval */
&amp;nbsp; &amp;nbsp; if Overlay_START_TS =. then do;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; START_TS = Base_START_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; END_TS = Base_END_TS;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Value = Base_Value;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; output;
&amp;nbsp; &amp;nbsp; end;
run;

/* Step 6: Remove duplicates and sort */
proc sort data=final_intervals nodupkey;
&amp;nbsp; &amp;nbsp; by ID START_TS END_TS Value;
run;

/* Step 7: Print results */
proc print data=final_intervals(keep=ID START_TS END_TS Value) noobs;
&amp;nbsp; &amp;nbsp; format START_TS END_TS datetime20.;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;FONT size="2"&gt;Output:&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;DIV class="branch"&gt;
&lt;DIV&gt;
&lt;DIV align="center"&gt;
&lt;TABLE class="table" summary="Procedure Print: Data Set WORK.FINAL_INTERVALS" frame="box" rules="all" cellspacing="0" cellpadding="5"&gt;
&lt;THEAD&gt;
&lt;TR&gt;
&lt;TH class="l header" scope="col"&gt;&lt;FONT size="2"&gt;ID&lt;/FONT&gt;&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;&lt;FONT size="2"&gt;START_TS&lt;/FONT&gt;&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;&lt;FONT size="2"&gt;END_TS&lt;/FONT&gt;&lt;/TH&gt;
&lt;TH class="r header" scope="col"&gt;&lt;FONT size="2"&gt;Value&lt;/FONT&gt;&lt;/TH&gt;
&lt;/TR&gt;
&lt;/THEAD&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:06:00:11&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:06:00:11&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:10:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:10:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:16:22:33&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:16:22:33&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;10&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:08:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:08:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;03JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;03JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:02:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:02:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:15:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:15:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:17:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:17:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:22:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:22:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:23:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;04JAN2025:23:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;05JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;05JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;10&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:03:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:03:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:05:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:05:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:23:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;A&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;06JAN2025:23:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;07JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:06:44:11&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:14:33:22&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:15:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:15:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:16:51:23&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:18:18:18&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:19:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;01JAN2025:19:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;10&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:00:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:08:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;20&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD class="l data"&gt;&lt;FONT size="2"&gt;B&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:08:00:00&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;02JAN2025:15:23:04&lt;/FONT&gt;&lt;/TD&gt;
&lt;TD class="r data"&gt;&lt;FONT size="2"&gt;99&lt;/FONT&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Jan 2025 16:20:07 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/How-to-create-a-dataset-with-merged-time-intervals-from-2/m-p/956430#M373488</guid>
      <dc:creator>lingcx</dc:creator>
      <dc:date>2025-01-17T16:20:07Z</dc:date>
    </item>
  </channel>
</rss>

