<?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: Excluding Date Periods From Other Date Periods in SAS Data Science</title>
    <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95832#M733</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Arthur,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Not working as required on live data sorry, I've created some new test data which is based on live stuff:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;All clinet1/sharer1 data should appear as they have no paid periods. There are also anomalies in the client2/sharer2 data as well.&lt;/P&gt;&lt;P&gt;Any ideas?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Tue, 11 Dec 2012 01:22:11 GMT</pubDate>
    <dc:creator>SteveNZ</dc:creator>
    <dc:date>2012-12-11T01:22:11Z</dc:date>
    <item>
      <title>Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95824#M725</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi SASers,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have a seemingly simple problem that I cant seem to solve. I have a set of dates per clients and I need to exclude periods they have have paid for.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I need to output the dates left over once the paid periods are taken out. I've created some test data below that highlights the permutations I've found in the live data, any help is very much appreciated as it's driving me mad!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;infile datalines delimiter=','; &lt;/P&gt;&lt;P&gt;input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,01jan2012,03jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,09jan2012,12jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,21jan2012,30jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,05feb2012,14feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,20feb2012,23feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,26feb2012,29feb2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods ;&lt;/P&gt;&lt;P&gt;infile datalines delimiter=','; &lt;/P&gt;&lt;P&gt;input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;datalines;&lt;/P&gt;&lt;P&gt;client1,client2,06jan2012,15jan2012&lt;/P&gt;&lt;P&gt;client1,client2,18jan2012,24jan2012&lt;/P&gt;&lt;P&gt;client1,client2,27jan2012,02feb2012&lt;/P&gt;&lt;P&gt;client1,client2,08feb2012,11feb2012&lt;/P&gt;&lt;P&gt;client1,client2,17feb2012,02mar2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The results for the above should be:&lt;/P&gt;&lt;P&gt;01Jan2012 - 03Jan2012&lt;/P&gt;&lt;P&gt;18Jan2012 - 20Jan2012&lt;/P&gt;&lt;P&gt;31Jan2012 - 02Feb2012&lt;/P&gt;&lt;P&gt;05Feb2012 - 07Feb2012&lt;/P&gt;&lt;P&gt;12Feb2012 - 14Feb2012&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Many thanks in advance&lt;/P&gt;&lt;P&gt;Steve&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 19:25:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95824#M725</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-10T19:25:24Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95825#M726</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Steve,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I've probably misunderstood what you are looking for and, if I really do understand the problem, am probably offering a sledge hammer approach where something much simpler is likely available.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I say I may have misunderstood the problem, as my code doesn't quite provide your stated desired results.&amp;nbsp; My code only shows date ranges that are in the "phone" dataset that aren't also in the "paid_periods" dataset.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If that is really what you are looking for then try the following:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,01jan2012,03jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,09jan2012,12jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,21jan2012,30jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,05feb2012,14feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,20feb2012,23feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,26feb2012,29feb2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&amp;nbsp; &lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,client2,06jan2012,15jan2012&lt;/P&gt;&lt;P&gt;client1,client2,18jan2012,24jan2012&lt;/P&gt;&lt;P&gt;client1,client2,27jan2012,02feb2012&lt;/P&gt;&lt;P&gt;client1,client2,08feb2012,11feb2012&lt;/P&gt;&lt;P&gt;client1,client2,17feb2012,02mar2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want (keep=clientid sharerid phone date_range);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid;&lt;/P&gt;&lt;P&gt;&amp;nbsp; array dates(40000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain dates: lowest highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if first.sharerid then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(of dates(*));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(lowest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(highest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lowest=min(lowest,startdt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; highest=max(highest,enddt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dates(i)=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if last.sharerid then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do until (last.sharerid2);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set paid_periods (rename=(clientid=clientid2 sharerid=sharerid2));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by clientid2 sharerid2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=paystart to payend;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(dates(i)) then call missing(dates(i));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if last.sharerid2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=lowest to highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if missing(first) and not missing(dates(i)) then first=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(first) and missing(dates(i+1)) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(first,date9.),put(last,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 20:46:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95825#M726</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-10T20:46:48Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95826#M727</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Arthur,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thank you very much for this, much appreciated. You are quite correct in your code as I managed to completely stuff up the results I wanted. This is exactly what I need, really appreciate the help.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;cheers&lt;/P&gt;&lt;P&gt;Steve&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 21:01:06 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95826#M727</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-10T21:01:06Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95827#M728</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Then, if you continue to use the code, as written it will only handle dates between the range of 01jan1960 and 07jul2069.&amp;nbsp; Will the suffice for your data?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 22:17:52 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95827#M728</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-10T22:17:52Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95828#M729</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hmm actually the code isn't giving me the answers I need though no fault of your code. In my efforts to simplify the test data and not cloud the issue I didn't mention that the output dates need to be by phone number ie each clientid shareid can have a number of phone numbers and the dates need to be by number.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Complicating it maybe is that they can have a cellphone and a landline and the dates of these may overlap.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Running your code over my live data gives the dates perfectly but it clumps all phone numbers together as one. Is there a way to modify it so it's by phone?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Apologies for not being clearer.&lt;/P&gt;&lt;P&gt;cheers&lt;/P&gt;&lt;P&gt;Steve&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 22:27:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95828#M729</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-10T22:27:18Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95829#M730</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Not sure what you are asking.&amp;nbsp; In the code I proposed everything is controlled by the variables that are in the two by statements and the subsequent first. and last. variables that are referenced.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The code was written to analyze the various &lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;clientid sharerid combinations. Phone isn't included in the paid periods data, so are you saying that you want to reuse that information for each &lt;SPAN style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;clientid sharerid phone combination?&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="background-color: #ffffff; font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 22:45:18 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95829#M730</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-10T22:45:18Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95830#M731</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Yes pretty much. For each clientid/sharerid/phone number period in the phone data set I need to exclude any payment periods from the paid_periods data set. Unfortunately the payments dont include the phone number being paid for so I need it done by phone number.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;When I run your code it appears to get the periods spot on but for each clientid/sharerid I get the same phone number being listed in the output.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;cheers&lt;/P&gt;&lt;P&gt;Steve&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 22:54:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95830#M731</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-10T22:54:22Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95831#M732</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Then, if file size isn't a problem, here is a sledge hammer/mechanical sledge hammer approach.&amp;nbsp; It is the same as what I had proposed earlier, but expands the paid_period file to account for all phone numbers.&amp;nbsp; Let us know if that solves the problem:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,01jan2012,03jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,09jan2012,12jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,21jan2012,30jan2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,05feb2012,14feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,20feb2012,23feb2012&lt;/P&gt;&lt;P&gt;client1,client2,555-6532,26feb2012,29feb2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,01jan2012,03jan2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,09jan2012,12jan2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,21jan2012,30jan2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,05feb2012,14feb2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,20feb2012,23feb2012&lt;/P&gt;&lt;P&gt;client1,client2,999-6532,26feb2012,29feb2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=phone out=unique_phone (keep=clientid sharerid phone) nodupkey;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,client2,06jan2012,15jan2012&lt;/P&gt;&lt;P&gt;client1,client2,18jan2012,24jan2012&lt;/P&gt;&lt;P&gt;client1,client2,27jan2012,02feb2012&lt;/P&gt;&lt;P&gt;client1,client2,08feb2012,11feb2012&lt;/P&gt;&lt;P&gt;client1,client2,17feb2012,02mar2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; as select a.*,b.phone as phone2&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from paid_periods a,unique_phone b&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; having a.clientid=b.clientid and&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.sharerid=b.sharerid&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by clientid,sharerid,phone,paystart&lt;/P&gt;&lt;P&gt;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want (keep=clientid sharerid phone date_range);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; array dates(40000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain dates: lowest highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if first.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(of dates(*));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(lowest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(highest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lowest=min(lowest,startdt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; highest=max(highest,enddt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dates(i)=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if last.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do until (last.phone2);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (rename=(clientid=clientid2 sharerid=sharerid2));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by clientid2 sharerid2 phone2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=paystart to payend;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(dates(i)) then call missing(dates(i));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if last.phone2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=lowest to highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if missing(first) and not missing(dates(i)) then first=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(first) and missing(dates(i+1)) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(first,date9.),put(last,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 10 Dec 2012 23:22:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95831#M732</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-10T23:22:29Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95832#M733</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Arthur,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Not working as required on live data sorry, I've created some new test data which is based on live stuff:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;All clinet1/sharer1 data should appear as they have no paid periods. There are also anomalies in the client2/sharer2 data as well.&lt;/P&gt;&lt;P&gt;Any ideas?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 01:22:11 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95832#M733</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-11T01:22:11Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95833#M734</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Had to bring out the JackHammer.&amp;nbsp; The following might get around the various anomolies.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;proc sort data=phone out=unique_phone (keep=clientid sharerid phone) nodupkey;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;proc sort data=phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; as select a.paystart,a.payend,b.phone as phone2,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.clientid,b.sharerid&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from unique_phone b left join paid_periods a&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on a.clientid=b.clientid and&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.sharerid=b.sharerid&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by clientid,sharerid,phone,paystart&lt;/P&gt;&lt;P&gt;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;data paid_periods_expanded;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set paid_periods_expanded;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if missing(paystart) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paystart='02jan1960'd;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; payend='02jan1960'd;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;data want (keep=clientid sharerid phone date_range);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; array dates(40000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain dates: lowest highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if first.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(of dates(*));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(lowest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(highest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lowest=min(lowest,startdt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; highest=max(highest,enddt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dates(i)=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if last.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do until (last.phone2);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (rename=(clientid=clientid2 sharerid=sharerid2));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by clientid2 sharerid2 phone2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=paystart to payend;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(dates(i)) then call missing(dates(i));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if last.phone2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=lowest to highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if missing(first) and not missing(dates(i)) then first=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(first) and missing(dates(i+1)) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(first,date9.),put(last,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 04:37:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95833#M734</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-11T04:37:04Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95834#M735</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Since Art has mentioned 'JackHammer', I had to bring up Hash(). Please note that you can't use it if your second table can't be fitted into your RAM.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;STRONG style="color: navy; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;data&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; phone ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;infile&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; datalines &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;delimiter&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;','&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;input&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; clientid $ sharerid $ phone $ startdt enddt ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;informat&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; startdt enddt &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: teal; background: white;"&gt;date9.&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;format&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; startdt enddt &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: teal; background: white;"&gt;date9.&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;datalines&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;STRONG style="color: navy; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;data&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paid_periods;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;infile&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; datalines &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;delimiter&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;=&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;','&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;input&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; clientid $ sharerid $ paystart payend ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;informat&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paystart payend &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: teal; background: white;"&gt;date9.&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;format&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paystart payend &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: teal; background: white;"&gt;date9.&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; ;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;datalines&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: #FFFFC0;"&gt;client2,sharer2,20Oct2010,13May2011&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;STRONG style="color: navy; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;data&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; want_1;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; _n_=&lt;/SPAN&gt;&lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;1&lt;/STRONG&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt; &lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;0&lt;/STRONG&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;set&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paid_periods;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;declare&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; hash h(dataset:&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'paid_periods'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;,multidata:&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'y'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; h.definekey(&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'clientid'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;, &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'sharerid'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; h.definedata(&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'paystart'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;, &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: purple; background: white;"&gt;'payend'&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; h.definedone();&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;set&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; phone;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; _rc=h.find();&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;do&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; _rc=&lt;/SPAN&gt;&lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;0&lt;/STRONG&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;by&lt;/SPAN&gt; &lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;0&lt;/STRONG&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;while&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; (_rc=&lt;/SPAN&gt;&lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;0&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;);&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paystart&amp;lt;= startdt &amp;lt;= payend &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; startdt=payend+&lt;/SPAN&gt;&lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;&amp;nbsp; paystart&amp;lt;= enddt &amp;lt;= payend &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; enddt=paystart-&lt;/SPAN&gt;&lt;STRONG style="color: teal; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;1&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; startdt &amp;gt; enddt &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;leave&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _rc=h.find_next();&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;end&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; enddt&amp;gt;= startdt &lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;then&lt;/SPAN&gt; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;output&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: blue; background: white;"&gt;drop&lt;/SPAN&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; paystart payend _rc;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;STRONG style="color: navy; background: white; font-size: 10.0pt; font-family: 'Courier New';"&gt;run&lt;/STRONG&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt;;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="margin-bottom: .0001pt;"&gt;&lt;SPAN style="font-size: 10.0pt; font-family: 'Courier New'; color: black; background: white;"&gt; &lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;Haikuo &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 15:18:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95834#M735</guid>
      <dc:creator>Haikuo</dc:creator>
      <dc:date>2012-12-11T15:18:12Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95835#M736</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;SteveNZ,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;A couple of suggestions ...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First, it's difficult to believe that you have found all the possible permutations.&amp;nbsp; It seems reasonable that a paid period might fall in the middle of a worked period, and a single work period could generate two date ranges that are unpaid.&amp;nbsp; That being said, it might be safer to generate a separate observation for each day that is unpaid, and to aggregate those single days into ranges afterwards.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Second, this type of problem can be handled fairly cleanly by creating a format.&amp;nbsp; The format would translate the paid periods into the word "Paid".&amp;nbsp; For example, assuming the data set PAID_PERIODS exists:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain fmtname '$paid' label 'Paid';&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; start = clientid || sharerid || put(paystart, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end = clientid || sharerid || put(payend, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; keep fmtname start end label;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format cntlin=paid_periods2;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This type of format could easily output individual days that haven't been paid, along these lines:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;do day = startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if put(clientid || sharerid || put(day, yymmddn8.), $paid.) ne 'Paid' then output;&lt;/P&gt;&lt;P&gt;end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This approach generates the list of individual days, because of my first suggestion above.&amp;nbsp; The plan would be to aggregate the individual days into ranges later.&amp;nbsp; If you are 100% certain that you will never need two ranges instead or one, then a more complex loop could be constructed.&amp;nbsp; But first, let's see if we have found the right set of rules and assumptions.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Good luck.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 15:48:55 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95835#M736</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-12-11T15:48:55Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95836#M737</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="5068" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: JackHammer?&amp;nbsp; Not at all!&amp;nbsp; This, IMHO, is an excellent use of a hash and I liked the way that you approached it!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I tried a number of variations of the input data and, in each case, both of our suggested sets of code produced the same results.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I modified your code, just a bit, to produce the output that the OP had originally asked for:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if _n_=1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 0 then set paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash h(dataset:'paid_periods',multidata:'y');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definekey('clientid', 'sharerid');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definedata('paystart', 'payend');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definedone();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _rc=h.find();&lt;/P&gt;&lt;P&gt;&amp;nbsp; do _rc=0 by 0 while (_rc=0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if paystart&amp;lt;= startdt &amp;lt;= payend then startdt=payend+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&amp;nbsp; paystart&amp;lt;= enddt &amp;lt;= payend then enddt=paystart-1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if startdt &amp;gt; enddt then leave;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _rc=h.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if enddt&amp;gt;= startdt then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(startdt,date9.),put(enddt,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop paystart payend _rc startdt enddt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A __default_attr="5253" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: I, for one, would be interested in seeing the full format approach that produces the same result.&lt;/P&gt;&lt;P&gt;&lt;A __default_attr="807252" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: Haikuo's code is much better than mine.&amp;nbsp; I think you ought to unmark mine as being correct and, instead, give the credit to Haikuo.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 16:22:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95836#M737</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-11T16:22:24Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95837#M738</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Art,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here's the rest of the format approach.&amp;nbsp; It picks up right after creating the format.&amp;nbsp; If I were going for clarity rather than speed, I would go about it this way:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do day=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if put(clientid || sharerid || put(day, yymmddn8.), $paid.) ne 'Paid' then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop startdt enddt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; prior_day = lag(day);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.phone or prior_day + 1 ne day then groupnum + 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop prior_day;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone groupnum;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.groupnum then start_of_range = day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain start_of_range;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if last.groupnum then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end_of_range=day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop day;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Sorry, but all of this is untested code.&amp;nbsp; If I were going for speed rather than clarity, I might replace all three steps with:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do day=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = put(clientid || sharerid || put(day, yymmddn8.), $paid.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if result ne 'Paid' then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if start_of_range=. then start_of_range=day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end_of_range=day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if start_of_range &amp;gt; . then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; start_of_range=.;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if start_of_range &amp;gt; . then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop result day;&lt;/P&gt;&lt;P&gt;run;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;This actually allows for any number of unpaid groups of days appearing between startdt and enddt and outputs a separate observation for each group ... assuming it works!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 17:12:25 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95837#M738</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-12-11T17:12:25Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95838#M739</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="5253" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: Nice!&amp;nbsp; Needed one extra sort routine, and I added the line to create the date_range variable, but your code ends up with the same results as Haikuo's and my code.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain fmtname '$paid' label 'Paid';&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; start = clientid || sharerid || put(paystart, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end = clientid || sharerid || put(payend, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; keep fmtname start end label;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format cntlin=paid_periods2;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do day=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if put(clientid || sharerid || put(day, yymmddn8.), $paid.) ne 'Paid' then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop startdt enddt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; prior_day = lag(day);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.phone or prior_day + 1 ne day then groupnum + 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop prior_day;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want_2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone groupnum;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.groupnum then start_of_range = day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain start_of_range;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if last.groupnum then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end_of_range=day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(start_of_range,date9.),put(end_of_range,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop day groupnum start_: end_:;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 18:30:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95838#M739</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-11T18:30:12Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95839#M740</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Art,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks.&amp;nbsp; I know it's work to do all that testing.&amp;nbsp; Here's one final test case, to see if all solutions are equal.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In PHONE, startdt=01jan2012 enddt=30jan2012&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;In PAID, paystart=14jan2012 payend=21jan2012&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It's possible that this is an unrealistic situation, but in real life data are often much stranger than what logic or imagination might suggest.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I tried to see if your data tests this type of condition, but the eyesight is starting to blur here!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 18:52:54 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95839#M740</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2012-12-11T18:52:54Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95840#M741</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;First of all huge thanks to everyone for your help, really appreciated. I tried all versions but the format one works the best. The hash version misses the example above from Astounding which sadly does happen in the data. I'll do some more testing on live data and let you know how it goes.&lt;/P&gt;&lt;P&gt;I dont really like to single out a 'winner' as such as all answers helped the next person but I'm going to try to give Astounding the points for the format approach and helpfuls to Art and Hai.Kuo? Please let me know if this upsets anyone!&lt;/P&gt;&lt;P&gt;Thanks again and have a great xmas&lt;/P&gt;&lt;P&gt;Steve&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 19:56:04 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95840#M741</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-11T19:56:04Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95841#M742</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="5253" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: I threw in your extra test case as well as one additional one.&amp;nbsp; Both the format and JackHammer approaches ended up with the same (correct) results, where the hash approach failed on both of the extra cases.&amp;nbsp; Your format approach ran significantly faster than my JackHammer approach.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;A __default_attr="807252" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: I completely agree with your designations of which solution was "correct."&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;client3,sharer3,777-7777,01jan2012,30jan2012&lt;/P&gt;&lt;P&gt;client4,sharer4,888-8888,01jan2012,30jan2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone startdt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client9,sharer9,09Aug1999,09Aug2009&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;client3,sharer3,14jan2012,21jan2012&lt;/P&gt;&lt;P&gt;client4,sharer4,14jan2012,21jan2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*JackHammer approach*/&lt;/P&gt;&lt;P&gt;proc sort data=phone out=unique_phone (keep=clientid sharerid phone) nodupkey;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sql;&lt;/P&gt;&lt;P&gt;&amp;nbsp; create table paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; as select a.paystart,a.payend,b.phone as phone2,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; b.clientid,b.sharerid&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from unique_phone b left join paid_periods a&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; on a.clientid=b.clientid and&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; a.sharerid=b.sharerid&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; order by clientid,sharerid,phone,paystart&lt;/P&gt;&lt;P&gt;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods_expanded;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set paid_periods_expanded;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if missing(paystart) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paystart='02jan1960'd;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; payend='02jan1960'd;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want_1 (keep=clientid sharerid phone date_range);&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; array dates(40000);&lt;/P&gt;&lt;P&gt;&amp;nbsp; retain dates: lowest highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if first.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(of dates(*));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(lowest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(highest);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lowest=min(lowest,startdt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; highest=max(highest,enddt);&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dates(i)=i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if last.phone then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; do until (last.phone2);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set paid_periods_expanded&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (rename=(clientid=clientid2 sharerid=sharerid2));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by clientid2 sharerid2 phone2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=paystart to payend;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(dates(i)) then call missing(dates(i));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if last.phone2 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do i=lowest to highest;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if missing(first) and not missing(dates(i)) then first=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not missing(first) and missing(dates(i+1)) then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; last=dates(i);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(first,date9.),put(last,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(first);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; call missing(last);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*hash approach*/&lt;/P&gt;&lt;P&gt;proc sort data=paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid paystart;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;data want_2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if _n_=1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 0 then set paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; declare hash h(dataset:'paid_periods',multidata:'y');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definekey('clientid', 'sharerid');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definedata('paystart', 'payend');&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; h.definedone();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp; _rc=h.find();&lt;/P&gt;&lt;P&gt;&amp;nbsp; do _rc=0 by 0 while (_rc=0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if paystart&amp;lt;= startdt &amp;lt;= payend then startdt=payend+1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if&amp;nbsp; paystart&amp;lt;= enddt &amp;lt;= payend then enddt=paystart-1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if startdt &amp;gt; enddt then leave;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; _rc=h.find_next();&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if enddt&amp;gt;= startdt then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(startdt,date9.),put(enddt,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop paystart payend _rc startdt enddt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;/*format approach*/&lt;/P&gt;&lt;P&gt;data paid_periods2;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain fmtname '$paid' label 'Paid';&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; start = clientid || sharerid || put(paystart, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end = clientid || sharerid || put(payend, yymmddn8.);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; keep fmtname start end label;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc format cntlin=paid_periods2;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; do day=startdt to enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if put(clientid || sharerid || put(day, yymmddn8.), $paid.) ne 'Paid' then output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop startdt enddt;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;proc sort data=individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set individual_unpaid_days;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; prior_day = lag(day);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.phone or prior_day + 1 ne day then groupnum + 1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop prior_day;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want_3;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; set assign_group;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; by clientid sharerid phone groupnum;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if first.groupnum then start_of_range = day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; retain start_of_range;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; if last.groupnum then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end_of_range=day;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date_range=catx("-",put(start_of_range,date9.),put(end_of_range,date9.));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop day groupnum start_: end_:;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 11 Dec 2012 21:02:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95841#M742</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-11T21:02:41Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95842#M743</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Have been doing live testing of the code and it works but my big concern is the very large filesize that occurs. I then wondered if putting all the dates on a timeline might be a better way of doing it and have written the following code, is there a way to use this approach to get accurate dates? I've included the test data at the top. If this could be used then filesizes are dramatically reduced. Basically I've got this far but cant work out how to get the dates from it.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data phone ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ phone $ startdt enddt ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format startdt enddt date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client1,sharer1,555-6532,21Nov2011,10Dec2012&lt;/P&gt;&lt;P&gt;client1,sharer1,444-5655,29Nov2010,14Feb2011&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,20May1993,17Aug1993&lt;/P&gt;&lt;P&gt;client1,sharer1,333-1234,08Sep1993,08Sep1993&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Jul2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,666-6548,10Apr2002,06Aug2002&lt;/P&gt;&lt;P&gt;client2,sharer2,111-5658,02Nov1992,12Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,222-6589,10Jan2000,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,31Jan2000,03Feb2000&lt;/P&gt;&lt;P&gt;client2,sharer2,777-8755,25Jun2009,14Sep2009&lt;/P&gt;&lt;P&gt;client2,sharer2,321-6544,18Dec2003,08Apr2004&lt;/P&gt;&lt;P&gt;client2,sharer2,778-6589,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,31Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,999-9988,28Mar1994,28Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,888-7845,12Aug1993,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,10Aug1994,05Sep1994&lt;/P&gt;&lt;P&gt;client2,sharer2,789-9876,22Jun1995,10Jul1995&lt;/P&gt;&lt;P&gt;client2,sharer2,951-6235,08Apr2004,10Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,753-1245,25Jan2007,18Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,12Nov1998,26Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,656-8989,10Dec1999,10Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,23Aug2000,26Mar2001&lt;/P&gt;&lt;P&gt;client2,sharer2,141-1414,07Jun2001,10Jul2001&lt;/P&gt;&lt;P&gt;client2,sharer2,363-3636,19Jun1998,12Nov1998&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,18Jun2009,02Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,20Oct2010,16May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,852-8525,31May2012,10Dec2012&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,05Sep1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,565-5656,14Nov1994,14Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,221-2212,01jan2012,30jan2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data paid_periods;&lt;/P&gt;&lt;P&gt;&amp;nbsp; infile datalines delimiter=',';&lt;/P&gt;&lt;P&gt;&amp;nbsp; input clientid $ sharerid $ paystart payend ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; informat paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; format paystart payend date9. ;&lt;/P&gt;&lt;P&gt;&amp;nbsp; datalines;&lt;/P&gt;&lt;P&gt;client2,sharer2,31Aug1992,23Aug1993&lt;/P&gt;&lt;P&gt;client2,sharer2,25Dec1993,26Mar1994&lt;/P&gt;&lt;P&gt;client2,sharer2,10Aug1994,01Nov1994&lt;/P&gt;&lt;P&gt;client2,sharer2,15Mar1995,20Mar1995&lt;/P&gt;&lt;P&gt;client2,sharer2,19Jun1998,18Feb1999&lt;/P&gt;&lt;P&gt;client2,sharer2,10Dec1999,31Jan2000&lt;/P&gt;&lt;P&gt;client2,sharer2,20Jun2001,12Nov2001&lt;/P&gt;&lt;P&gt;client2,sharer2,10Apr2002,27Jul2002&lt;/P&gt;&lt;P&gt;client2,sharer2,18Dec2003,06Aug2004&lt;/P&gt;&lt;P&gt;client2,sharer2,11Dec2006,17Jul2007&lt;/P&gt;&lt;P&gt;client2,sharer2,18Jun2009,01Jun2010&lt;/P&gt;&lt;P&gt;client2,sharer2,20Oct2010,13May2011&lt;/P&gt;&lt;P&gt;client2,sharer2,14jan2012,21jan2012&lt;/P&gt;&lt;P&gt;;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;proc sql;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table ph as&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;select distinct clientid,sharerid,phone&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;from phone&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table pays as&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;select distinct rs.*,ph.phone&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;from paid_periods rs, ph&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;where rs.clientid=ph.clientid and rs.sharerid=ph.sharerid&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data phprd(keep=phone clientid sharerid phone_flag date)&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set phone ;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; phone_flag=1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date=startdt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; phone_flag=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date=enddt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sort data=phprd;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by phone clientid sharerid date;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data payprd(keep = phone clientid sharerid pay_flag date)&amp;nbsp;&amp;nbsp; ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set pays;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pay_flag=1;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date=paystart;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pay_flag=0;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; date=payend;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; output;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sort data=payprd;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by phone clientid sharerid date;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data timeline ;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set payprd phprd;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; format date ddmmyy10. clientid sharerid 12.;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by phone clientid sharerid date;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Dec 2012 23:17:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95842#M743</guid>
      <dc:creator>SteveNZ</dc:creator>
      <dc:date>2012-12-12T23:17:16Z</dc:date>
    </item>
    <item>
      <title>Re: Excluding Date Periods From Other Date Periods</title>
      <link>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95843#M744</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&lt;A __default_attr="807252" __jive_macro_name="user" class="jive_macro jive_macro_user" data-objecttype="3" href="https://communities.sas.com/"&gt;&lt;/A&gt;: I would suggest posting this as a new question so that others have a chance to get points for answering it. Not that I have any need for more points, but it does entice others to spend some time answering such questions.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 12 Dec 2012 23:29:45 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Data-Science/Excluding-Date-Periods-From-Other-Date-Periods/m-p/95843#M744</guid>
      <dc:creator>art297</dc:creator>
      <dc:date>2012-12-12T23:29:45Z</dc:date>
    </item>
  </channel>
</rss>

