<?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: calculate total net stay and gap days in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605423#M175715</link>
    <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/135631"&gt;@APU_007&lt;/a&gt;&amp;nbsp; can you please review and confirm for ID1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Stay:&amp;nbsp;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;23-Jan-04&lt;/TD&gt;
&lt;TD&gt;27-Aug-18&lt;/TD&gt;
&lt;TD&gt;5330&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;isn't this&amp;nbsp;27aug2018-23jan2004+1 meaning an inclusive of start_date and end_date making it 5331 rather than 5330?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;

data have;
    infile cards;
	input id start_date:anydtdte. end_date:anydtdte.;
	format start_date end_date date9.;
cards;
1	23-Jan-04	27-Mar-08
1	27-Mar-10	27-Mar-13
1	27-Mar-10	27-Aug-18
1	27-Mar-13	27-Mar-15
1	25-Sep-13	25-May-16
2	16-Dec-06	12-Dec-18
2	16-Jan-09	16-Jan-14
2	16-Jan-14	16-Jan-17
3	23-Jan-04	27-Mar-08
3	23-Jan-09	27-Mar-12
3	1-May-14	1-May-18
4	25-Feb-08	25-Feb-15
4	7-Mar-08	7-Mar-15
4	28-Feb-19	28-Feb-20
;

/*Get the number of dimensions in the array*/
proc sql;
select min(start_date), max(end_date) into :s trimmed, :e trimmed
from have;
quit;
/*Key Indexing method*/
data want;
 do until(last.id);
  set have;
  by id;
  array t(&amp;amp;s:&amp;amp;e) _temporary_;
  do _n_=start_date to end_date;
   t(_n_)=1;
  end;
  _min=min(_min,start_date);
  _max=max(_max,end_date);
 end;
 stay=sum(of t(*));
 do _n_=_min to _max;
  gap=sum(gap,nmiss(t(_n_)));
 end;
 totay_stay=_max-_min+1;
 call missing(of t(*));
rename _min=start_date _max=end_date;
drop start_date end_date;
format _: date9.;
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
    <pubDate>Tue, 19 Nov 2019 16:01:52 GMT</pubDate>
    <dc:creator>novinosrin</dc:creator>
    <dc:date>2019-11-19T16:01:52Z</dc:date>
    <item>
      <title>calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605405#M175710</link>
      <description>&lt;P&gt;I have found some help but not quite able to resolve the issues so looking for a help to get it done correctly. Here is the example of sample data-set and result data-set that is desired.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Data have:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;START_DATE&lt;/TD&gt;&lt;TD&gt;End_Date&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;23-Jan-04&lt;/TD&gt;&lt;TD&gt;27-Mar-08&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;27-Mar-10&lt;/TD&gt;&lt;TD&gt;27-Mar-13&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;27-Mar-10&lt;/TD&gt;&lt;TD&gt;27-Aug-18&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;27-Mar-13&lt;/TD&gt;&lt;TD&gt;27-Mar-15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;25-Sep-13&lt;/TD&gt;&lt;TD&gt;25-May-16&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16-Dec-06&lt;/TD&gt;&lt;TD&gt;12-Dec-18&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16-Jan-09&lt;/TD&gt;&lt;TD&gt;16-Jan-14&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16-Jan-14&lt;/TD&gt;&lt;TD&gt;16-Jan-17&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;23-Jan-04&lt;/TD&gt;&lt;TD&gt;27-Mar-08&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;23-Jan-09&lt;/TD&gt;&lt;TD&gt;27-Mar-12&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;1-May-14&lt;/TD&gt;&lt;TD&gt;1-May-18&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;25-Feb-08&lt;/TD&gt;&lt;TD&gt;25-Feb-15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;7-Mar-08&lt;/TD&gt;&lt;TD&gt;7-Mar-15&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;28-Feb-19&lt;/TD&gt;&lt;TD&gt;28-Feb-20&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Data want:&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;ID&lt;/TD&gt;&lt;TD&gt;START_DATE&lt;/TD&gt;&lt;TD&gt;End_Date&lt;/TD&gt;&lt;TD&gt;Stay&lt;/TD&gt;&lt;TD&gt;Gap&lt;/TD&gt;&lt;TD&gt;Net_Stay&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;1&lt;/TD&gt;&lt;TD&gt;23-Jan-04&lt;/TD&gt;&lt;TD&gt;27-Aug-18&lt;/TD&gt;&lt;TD&gt;5330&lt;/TD&gt;&lt;TD&gt;730&lt;/TD&gt;&lt;TD&gt;4600&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;2&lt;/TD&gt;&lt;TD&gt;16-Dec-06&lt;/TD&gt;&lt;TD&gt;12-Dec-18&lt;/TD&gt;&lt;TD&gt;4379&lt;/TD&gt;&lt;TD&gt;0&lt;/TD&gt;&lt;TD&gt;4379&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;3&lt;/TD&gt;&lt;TD&gt;23-Jan-04&lt;/TD&gt;&lt;TD&gt;1-May-18&lt;/TD&gt;&lt;TD&gt;5212&lt;/TD&gt;&lt;TD&gt;1067&lt;/TD&gt;&lt;TD&gt;4145&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;4&lt;/TD&gt;&lt;TD&gt;25-Feb-08&lt;/TD&gt;&lt;TD&gt;28-Feb-20&lt;/TD&gt;&lt;TD&gt;4386&lt;/TD&gt;&lt;TD&gt;1454&lt;/TD&gt;&lt;TD&gt;2932&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;What is actually needed:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;START_DATE - minimum for a given ID&lt;/P&gt;&lt;P&gt;End_Date - maximum for a given ID&lt;/P&gt;&lt;P&gt;Stay - Total Stayed&lt;/P&gt;&lt;P&gt;Gap - Any gap during the stay&lt;/P&gt;&lt;P&gt;NetStay - Total Stay - Gap&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Started thinking about going this route but appears with this logic - not able to salvage min(Start_Date) and Max(End_Date).&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data diff;
merge have
HAVE(firstobs=2 keep=ID START_DATE end_date rename=(ID=nID START_DATE=nSTART_DATE end_date=nend_date));
diff_date=end_date-start_date;
if ID=NID then do;
diff_btwn_date=nSTART_DATE-end_date;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Note: i am using SAS9.4&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;So, GAP is calculated as nStart Date - End_date.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;Example: For ID1 - There is no coverage between 3/27/2008 and 3/27/2010 so the GAP = 730 days. If there are multiple gaps then it has to be summed up to get the total gap days (for ID3 = 302 + 765 = 1067 days)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Thank you in advance for your help!&lt;/P&gt;</description>
      <pubDate>Tue, 19 Nov 2019 14:50:50 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605405#M175710</guid>
      <dc:creator>APU_007</dc:creator>
      <dc:date>2019-11-19T14:50:50Z</dc:date>
    </item>
    <item>
      <title>Re: calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605408#M175711</link>
      <description>&lt;P&gt;So there is not logik determining&amp;nbsp;&lt;SPAN&gt;Gap? Should this just be selected randomly or?&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 19 Nov 2019 14:43:10 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605408#M175711</guid>
      <dc:creator>PeterClemmensen</dc:creator>
      <dc:date>2019-11-19T14:43:10Z</dc:date>
    </item>
    <item>
      <title>Re: calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605414#M175713</link>
      <description>&lt;P&gt;This is a bit of a "brute force" way to program it, but it should work&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data have;
    infile cards;
	input id start_date:anydtdte. end_date:anydtdte.;
cards;
1	23-Jan-04	27-Mar-08
1	27-Mar-10	27-Mar-13
1	27-Mar-10	27-Aug-18
1	27-Mar-13	27-Mar-15
1	25-Sep-13	25-May-16
2	16-Dec-06	12-Dec-18
2	16-Jan-09	16-Jan-14
2	16-Jan-14	16-Jan-17
3	23-Jan-04	27-Mar-08
3	23-Jan-09	27-Mar-12
3	1-May-14	1-May-18
4	25-Feb-08	25-Feb-15
4	7-Mar-08	7-Mar-15
4	28-Feb-19	28-Feb-20
;

/* Compute max and min dates of all stays */
proc summary data=have nway;
    class id;
    var start_date end_date;
    output out=stay min(start_date)=min_start_date max(end_date)=max_end_date;
run;

/* Compute if each date between min_start_date and max_start_date is "stay" or "gap" */
data stay2;
    merge have stay;
	by id;
	do thisdate=min_start_date to max_end_date;
            if start_date&amp;lt;=thisdate&amp;lt;=end_date then gap=0;
	    else gap=1;
            output;
	end;
run;

/* Find days that are "gap" */
proc summary data=stay2 nway;
	class id thisdate;
	var gap;
	output out=gap min=min_gap;
run;

/* Add up number of gap days */
proc summary data=gap nway;
	class id;
	var min_gap;
	output out=want sum=gap;
run;

/* Now&amp;nbsp;that&amp;nbsp;you&amp;nbsp;have&amp;nbsp;total&amp;nbsp;length&amp;nbsp;of&amp;nbsp;stay&amp;nbsp;and&amp;nbsp;number&amp;nbsp;of&amp;nbsp;gap&amp;nbsp;days,&amp;nbsp;you&amp;nbsp;do&amp;nbsp;the&amp;nbsp;rest&amp;nbsp;*/&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 19 Nov 2019 15:11:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605414#M175713</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2019-11-19T15:11:45Z</dc:date>
    </item>
    <item>
      <title>Re: calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605418#M175714</link>
      <description>&lt;P&gt;Sir&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/10892"&gt;@PaigeMiller&lt;/a&gt;&amp;nbsp; Neat work with right set of comments to follow. Very nice!&lt;/P&gt;</description>
      <pubDate>Tue, 19 Nov 2019 15:18:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605418#M175714</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2019-11-19T15:18:42Z</dc:date>
    </item>
    <item>
      <title>Re: calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605423#M175715</link>
      <description>&lt;P&gt;Hello&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/135631"&gt;@APU_007&lt;/a&gt;&amp;nbsp; can you please review and confirm for ID1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Stay:&amp;nbsp;&lt;/P&gt;
&lt;TABLE&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;23-Jan-04&lt;/TD&gt;
&lt;TD&gt;27-Aug-18&lt;/TD&gt;
&lt;TD&gt;5330&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P&gt;&amp;nbsp;isn't this&amp;nbsp;27aug2018-23jan2004+1 meaning an inclusive of start_date and end_date making it 5331 rather than 5330?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;

data have;
    infile cards;
	input id start_date:anydtdte. end_date:anydtdte.;
	format start_date end_date date9.;
cards;
1	23-Jan-04	27-Mar-08
1	27-Mar-10	27-Mar-13
1	27-Mar-10	27-Aug-18
1	27-Mar-13	27-Mar-15
1	25-Sep-13	25-May-16
2	16-Dec-06	12-Dec-18
2	16-Jan-09	16-Jan-14
2	16-Jan-14	16-Jan-17
3	23-Jan-04	27-Mar-08
3	23-Jan-09	27-Mar-12
3	1-May-14	1-May-18
4	25-Feb-08	25-Feb-15
4	7-Mar-08	7-Mar-15
4	28-Feb-19	28-Feb-20
;

/*Get the number of dimensions in the array*/
proc sql;
select min(start_date), max(end_date) into :s trimmed, :e trimmed
from have;
quit;
/*Key Indexing method*/
data want;
 do until(last.id);
  set have;
  by id;
  array t(&amp;amp;s:&amp;amp;e) _temporary_;
  do _n_=start_date to end_date;
   t(_n_)=1;
  end;
  _min=min(_min,start_date);
  _max=max(_max,end_date);
 end;
 stay=sum(of t(*));
 do _n_=_min to _max;
  gap=sum(gap,nmiss(t(_n_)));
 end;
 totay_stay=_max-_min+1;
 call missing(of t(*));
rename _min=start_date _max=end_date;
drop start_date end_date;
format _: date9.;
run;
&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 19 Nov 2019 16:01:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605423#M175715</guid>
      <dc:creator>novinosrin</dc:creator>
      <dc:date>2019-11-19T16:01:52Z</dc:date>
    </item>
    <item>
      <title>Re: calculate total net stay and gap days</title>
      <link>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605452#M175726</link>
      <description>&lt;P&gt;Hello &lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/138205"&gt;@novinosrin&lt;/a&gt;,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;This is what I was exactly looking for. Thank you so much for this piece of code. Regarding, adding +1, I was excluding the start date for a final total stay. It can be included/excluded as this would be a rule for every observation!&lt;/P&gt;</description>
      <pubDate>Tue, 19 Nov 2019 16:56:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/calculate-total-net-stay-and-gap-days/m-p/605452#M175726</guid>
      <dc:creator>APU_007</dc:creator>
      <dc:date>2019-11-19T16:56:45Z</dc:date>
    </item>
  </channel>
</rss>

