Search code examples
sassas-macro

sas macro code to check missing dates


If the input date is given below then the date output should be as given

I want sas macro code to check missing date in the inputs

    1.-MMM-YYYY = 01-MMM-YYYY
    --YYYY    = 01-JAN-YYYY 
    DD--YYYY  = DD-JAN-YYYY 
    DD-MMM-   = DD-MMM-0000

Solution

  • I created a dataset with all possible situations of missing day, month and year. The datasteps below address all possibilities and how to handle them to create the result variable new_bdate in the format you requested.

    data have; 
      input birthdate $20.; 
       datalines4;
      -JAN-1975 
      --1977 
      02--1978 
      03-JAN- 
      01-JAN-1980
      03--
      -JAN-
    ;;;;
    run;
    
    data haha2(Keep = birthdate new_bdate);
      set have;  
       format day $2. month $3. Year $4. New_bdate $11.;
       call scan(birthdate, 1, First_Pos, First_Length);
       First_Word = substrn(birthdate, First_Pos, First_Length);
       call scan(birthdate, -1, Last_Pos, Last_Length);
       Last_Word = substrn(birthdate, Last_Pos, Last_Length);
       if length(birthdate) = 11 then length1 = 'Y';
      else length1 = 'N';
    
       if length1 = 'Y' then do;
          Day = substr(birthdate,1,2);
          Month = substr(birthdate,4,3);
          Year = substr(birthdate,8,4);
       end;
       else if length1 = 'N' then do;
         if (First_Pos = '1' and Last_Length = '2')  then do 
                  Day = First_Word;
                  Month = 'JAN';
                  Year = '0000';
            end;
          else if (First_Pos = '1' and Last_Length = '3')  then do 
                  Day = First_Word;
                  Month = Last_Word;
                  Year = '0000';
            end;
         else if (First_Pos = '1' and Last_Length = '4')  then do 
                  Day = First_Word;
                  Month = 'JAN';
                  Year = Last_Word;
            end;
       if (First_Pos = '2' and Last_Length = '3')  then do 
                  Day = '01';
                  Month = First_Word;
                  Year = '0000';
            end;
          else if (First_Pos = '2' and Last_Length = '4')  then do 
                  Day = '01';
                  Month = First_Word;
                  Year = Last_Word;
            end;
         else if (First_Pos = '3' and Last_Length = '4')  then do 
                  Day = '01';
                  Month = 'JAN';
                  Year = Last_Word;
            end;
        end;
    New_bdate = Day||'-'||Month||'-'||Year;
    run;
    

    enter image description here