Zeit-Macro-Variablen, passend zu einem Tag

Der Macro %zeiten erstellt passend zum aktuellen Tagesdatum (default) oder zu einem beliebigen anderen Datum Zeit-Macro-Variablen.

"Passende" Zeit-Macro-Variablen sind z. B.

  • Anfang der VorWoche, wahlweise Sonntag oder Montag
  • Ende der VorWoche, wahlweise Fr, Sa, oder So
  • die "letzten 12 Monate" (von &VJJAMON6. bis &VORMON6. sind genau 12 Monate)
  • Vormonat (Anfang/ Ende), wichtig bei Jahreswechsel !!!

Einmal global definiert können die Zeit-Macro-Variablen in allen SAS-Macro-Programmen verwendet werden. Eine tolle Sache, z.B.

  • wenn regelmäßig und dynamisch auf einen bestimmten Zeitraum selektiert werden muß
  • zum erstellen von Jahresvergleichen über ein gleiches Zeitfenster

Beispiel für 13. Oktober 1999:

%zeiten(TestDatu=19991013);

Output:

Doku/Muster der Zeit-Definitionen (Vor-Monat, etc)
 
Durch den Macro 'zeiten' stehen folgende automatisch geladene
Macro-Variablen mit Zeiten zur Verfügung
 
Im Beispiel gilt:
     TestDatu= 19991013 (akt. Tag im Beispiel)
 
aktyy4   ist 2006      akt. Jahr zu akt. Datum
vormon8  ist 19990930  Vor-Monat, im 'passenden Jahr', mit LETZTEM Tag im Monat
vormon6  ist 199909    Vor-Monat, im 'passenden Jahr'
vvormon6 ist 199908    Vor-Vor-Monat, im 'passenden Jahr'
vjjvmon8 ist 19980901  Vor-Monat, im Vor-Jahr, mit 1. Tag im Monat
vjjvmon6 ist 199809    Vor-Monat, im Vor-Jahr
vvjvmon6 ist 199709    Vor-Monat, im Vor-Vor-Jahr
vjvvmon6 ist 199808    Vor-Vor-Monat, im Vor-Jahr
vjjamon8 ist 19981001  Monat, im Vor-Jahr, mit 1. Tag im Monat
vjjamon6 ist 199810    Monat, im Vor-Jahr
                       (AnwendungsBsp: von 199810 bis 199909 sind genau 12 Monate)
vorqtr6  ist 199903    Vor-Quartal, im 'passenden Jahr'
vjjvqtr6 ist 199803    Vor-Quartal, im Vor-Jahr
voryy6   ist 199801    Vor-Jahr, mit 1. Monat im Jahr
voryy4   ist 1998      Vor-Jahr
VORKWa8  ist 19991004  Vor-Woche, erster  Arbeits-Tag==Anfang der Vorwoche
                       (wenn Wochen-Anf.=Montag [erster Arbeitstag])
VORKWe8  ist 19991009  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])
VORKWFR8 ist 19991008  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Freitag [Fr=letzter Arbeitstag])
VORKWSA8 ist 19991009  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])
VORKWSO8 ist 19991010  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Sonntag [So=letzter Arbeitstag])
vvoryy4  ist 1997      Vor-Vor-Jahr
vvoryy6  ist 199701    Vor-Vor-Jahr, mit 1. Monat im Jahr
 

Beispiel für 29. September 2006 (heute):

%zeiten(TestDatu=20060929);

Output:

Doku/Muster der Zeit-Definitionen (Vor-Monat, etc)
 
Durch den Macro 'zeiten' stehen folgende automatisch geladene
Macro-Variablen mit Zeiten zur Verfügung
 
Im Beispiel gilt:
     TestDatu= 20060929 (akt. Tag im Beispiel)
 
aktyy4   ist 2006      akt. Jahr zu akt. Datum
vormon8  ist 20060831  Vor-Monat, im 'passenden Jahr', mit LETZTEM Tag im Monat
vormon6  ist 200608    Vor-Monat, im 'passenden Jahr'
vvormon6 ist 200607    Vor-Vor-Monat, im 'passenden Jahr'
vjjvmon8 ist 20050801  Vor-Monat, im Vor-Jahr, mit 1. Tag im Monat
vjjvmon6 ist 200508    Vor-Monat, im Vor-Jahr
vvjvmon6 ist 200408    Vor-Monat, im Vor-Vor-Jahr
vjvvmon6 ist 200507    Vor-Vor-Monat, im Vor-Jahr
vjjamon8 ist 20050901  Monat, im Vor-Jahr, mit 1. Tag im Monat
vjjamon6 ist 200509    Monat, im Vor-Jahr
                       (AnwendungsBsp: von 200509 bis 200608 sind genau 12 Monate)
vorqtr6  ist 200602    Vor-Quartal, im 'passenden Jahr'
vjjvqtr6 ist 200502    Vor-Quartal, im Vor-Jahr
voryy6   ist 200501    Vor-Jahr, mit 1. Monat im Jahr
voryy4   ist 2005      Vor-Jahr
VORKWa8  ist 20060918  Vor-Woche, erster  Arbeits-Tag==Anfang der Vorwoche
                       (wenn Wochen-Anf.=Montag [erster Arbeitstag])
VORKWe8  ist 20060923  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])
VORKWFR8 ist 20060922  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Freitag [Fr=letzter Arbeitstag])
VORKWSA8 ist 20060923  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])
VORKWSO8 ist 20060924  Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche
                       (wenn Wochen-Ende=Sonntag [So=letzter Arbeitstag])
vvoryy4  ist 2004      Vor-Vor-Jahr
vvoryy6  ist 200401    Vor-Vor-Jahr, mit 1. Monat im Jahr
 

Und die Macro-Definition:

/*-------------------------------------------------------------------
 *
 *   Zeit-Definitionen (Vor-Monat, etc)
 *
 *   folgende Macros stehen zur Verfügung:
 *              %zeiten;
 *
 *------------------------------------------------------------- */
                                                                      
%macro zeiten(TestDatu=);  
  
/*-----------------------------------------------------------------
   *      Zeit-Definitionen (Vor-Monat, etc)
   *
   *    Vor-Monats-Berechnung, neu+richtig:
   *            Bedeutet Vormonat mit dem "passenden" Jahr,
   *            wichtig zB bei "Vormonat von Januar".
   *
   *   Durch
   *           %zeiten;
   *   stehen folgende, automatisch geladene
   *                    
   *   Macro-Variablen mit Zeiten zur Verfügung:
   *      
   *   Beispiel mit TestDatu=19991013
   *            
   *     AKTyy4          = 1999       akt. Jahr zu akt. Datum
   *     AKTmm2          = 10         akt. Monat zu akt. Datum
   *     AKTdd2          = 13         akt. Tag zu akt. Datum
   *     AKTdat8         = 19991013   akt. Datum zu akt. Datum  
   *                       (INFO: sysdate9 enthält mm3 statt mm2 !!!)
   *     VORQTR6         = 199903     Vor-Quart. im "passend. Jahr"
   *     VJJVQTR6        = 199803     Vor-Quart. im Vor-Jahr
   *     VORMON8         = 19990930   Vor-Monat  im "passend. Jahr",
   *                                     mit LETZTEM Tag im Monat
   *     VORMON6         = 199909     Vor-Monat  im "passend. Jahr"
   *     VVORMON6        = 199908     Vor-Vor-Monat im "passend. Jahr"
   *     VJVVMON6        = 199808     Vor-Vor-Monat, im Vor-Jahr
   *     VVJVMON6        = 199709     Vor-Monat, im Vor-Vor-Jahr
   *     VJJVMON6        = 199809     Vor-Monat, im Vor-Jahr
   *     VJJAMON8        = 19981001   Monat, im Vor-Jahr 1.Tag d.Monat
   *     VJJAMON6        = 199810     Monat, im Vor-Jahr
   *
   * (AnwendungsBsp:
   *  von &VJJAMON6. bis &VORMON6. sind genau 12 Monate)
   *  VORYY6     = 199801        Vor-Jahr, mit 1. Monat im Jahr
   *  VORYY4     = 1998          Vor-Jahr
   *  VORKWe8    = 19991009      Vor-Woche,
   *                             ltz. Arbeits-Tag==Ende der Vorwoche
   * (Wochen-Ende=Samstag [Sa=letzter Arbeitstag])
   *  VORKWa8    = 19991004  Vor-Woche, erster Arb.Tag==Anf. Vorw.
   * (Wochen-Anf.=Montag  [Mo=erster Arbeitstag])
   *  V4KW8      = 19990913  Vor-4-Woch., 1. Arb.Tag==Anf. Vor-4-Woch.
   * (Wochen-Anf.=Montag [erster Arbeitstag])
   *  VVorYY4    = 1997      Vor-Vor-Jahr
   *  VVVYY4     = 1996      Vor-Vor-Vor-Jahr
   *
   * Verwendungs-Muster für Zeit-Makros:
   * ===================================
   * Bsp. 1) bis "Vor-VorMonat"
   *         alle drei Varianten machen im Endeffekt das gleiche!
   *           data datei2;
   *             set datei1;
   *             if datum < "&VORMON6.01";
   *           run;
   *
   *           data datei2;
   *             set datei1;
   *             if aufmonat <= "&VVORMON6.";
   *           run;
   *
   *           data datei2;
   *             set datei1;
   *             if aufdatum <= "&VVORMON6.31";
   *           run;
   *
   * Bsp. 2) "Vor-VorMonat" bis 12Monat rückwärts,
   *         (hier: von 19980901 bis 19990831, wenn "heute"=19991013)
   *           data datei2;
   *             set datei1;
   *             if "&VJJVMON6.01" <= aufdatum < "&VORMON6.01";
   *           run;
   *
   *------------------------------------------------------------- */
 

/* -------------------------------------------------------
     Definition von aktdatum mit eigenem Macro
   -------------------------------------------------------
*/
%macro aktdatum;
  
%global aktyy4;
  
%let    aktyy4=%substr(&SYSDATE9.,6,4);
  
%global aktdd2;
  
%let aktdd2=%substr(&SYSDATE9.,1,2);                  /* 20010911: mit aktdd2                      */
  
%global aktmm2;
  
%let aktmm3=%substr(&SYSDATE9.,3,3);                  /* 20010911: mit aktmm3, nur Hilfs-Variable! */
  
%if       &aktmm3. eq JAN %then %let aktmm2=01;       /* 20010911: mit aktmm2                      */
  
%else %if &aktmm3. eq FEB %then %let aktmm2=02;
  
%else %if &aktmm3. eq MAR %then %let aktmm2=03;
  
%else %if &aktmm3. eq APR %then %let aktmm2=04;
  
%else %if &aktmm3. eq MAY %then %let aktmm2=05;
  
%else %if &aktmm3. eq JUN %then %let aktmm2=06;
  
%else %if &aktmm3. eq JUL %then %let aktmm2=07;
  
%else %if &aktmm3. eq AUG %then %let aktmm2=08;
  
%else %if &aktmm3. eq SEP %then %let aktmm2=09;
  
%else %if &aktmm3. eq OCT %then %let aktmm2=10;
  
%else %if &aktmm3. eq NOV %then %let aktmm2=11;
  
%else %if &aktmm3. eq DEC %then %let aktmm2=12;
  
%else                           %let aktmm2=99;
  
%global aktdat8;
  
%let    aktdat8=&aktyy4.&aktmm2.&aktdd2.;             /* 20010911: mit aktdat8                     */
%mend aktdatum;

  %aktdatum;     
/* definiert &aktyy4. &aktmm2. &aktdd2 &aktdat8  */
                          
  
data _null_;
    
%if &TestDatu. eq
    
%then %do;
      aktdatum = date();    
    
%end;
    
%else %do;
      aktdatum = input(
"&TestDatu.", yymmdd8.);
    
%end;
 
    
/* Zwischen-Schritte: 1. Tag   im akt. Monat                */
    
/*                    1. Monat im akt. Jahr                 */
    
/* (unkritisch, denn JEDER Monat hat den Tag '01', ...)     */
    
aktmm8c =    put(year( aktdatum), z4.)
              || put(month(aktdatum),
z2.)
              ||
'01';
    aktyy8c =    put(year( aktdatum),
z4.)
              ||
'01'
              
|| '01';
    
/* Konvertierung von char ins SAS-date-Format               */
    
aktmm8d = input(aktmm8c, yymmdd8.);
    aktyy8d = input(aktyy8c,
yymmdd8.);
 
    
/* End-Schritt: ... minus 1 ergibt letzten Tag im Vor-Monat */
    
/*              intnx(..) geht nur mit SAS-date-Variable    */
    
vormm8d = intnx( 'day' , aktmm8d, -1 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vormm8c =    put(year( vormm8d), z4.)
              || put(month(vormm8d),
z2.)
              || put(day(  vormm8d),
z2.);
    vormon8 = vormm8c;
    
put vormon8=;
    
%global vormon8;
    
call symput('vormon8', vormon8);  
 
    
/* End-Schritt2: Akt-Tag minus 1 Monat ergibt (1. Tag im)    */
    
/*               Vor-Monat im "passenden" Jahr               */
    
/*               intnx(..) geht nur mit SAS-date-Variable    */
    
vormm6d = intnx( 'month', aktdatum, -1 );
    vormon6 =    put(year( vormm6d),
z4.)
              || put(month(vormm6d),
z2.);  
    
put vormon6=;     
    
%global vormon6;
    
call symput('vormon6', vormon6);
 
    
/* End-Schritt2.1: Akt-Tag minus 2 Monate ergibt (1. Tag im) */
    
/*                 Vor-Vor-Monat im "passenden" Jahr         */
    
/*                 intnx(..) geht nur mit SAS-date-Variable  */
    
vvormm6d = intnx( 'month', aktdatum, -2 );
    vvormon6 =    put(year( vvormm6d),
z4.)   
               || put(month(vvormm6d),
z2.);    
    
put vvormon6=;                          
    
%global vvormon6;
    
call symput('vvormon6', vvormon6);   
 
    
/* End-Schritt3a: Vor-Monat minus 12 Monate ergibt           */
    
/*               1. Tag im Vor-Monat im Vor-Jahr            */
    
/*               intnx(..) geht nur mit SAS-date-Variable   */
    
vjjvmm8d = intnx( 'month', vormm8d, -12 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vjjvmm8c =    put(year( vjjvmm8d), z4.)
               || put(month(vjjvmm8d),
z2.)
               || put(day(  vjjvmm8d),
z2.);
    vjjvmon8 = vjjvmm8c;
    
put vjjvmon8=;
    
%global vjjvmon8;
    
call symput('vjjvmon8', vjjvmon8);   
 
    vjjvmm6c =    put(year( vjjvmm8d),
z4.)
               || put(month(vjjvmm8d),
z2.);
    vjjvmon6 = vjjvmm6c;
    
put vjjvmon6=;
    
%global vjjvmon6;
    
call symput('vjjvmon6', vjjvmon6);  
 
    
/* End-Schritt3b: Vor-Monat minus 24 Monate ergibt          */
    
/*               1. Tag im Vor-Monat im Vor-Vor-Jahr        */
    
/*               intnx(..) geht nur mit SAS-date-Variable   */
    
vvjvmm8d = intnx( 'month', vormm8d, -24 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vvjvmm8c =    put(year( vvjvmm8d), z4.)
               || put(month(vvjvmm8d),
z2.)
               || put(day(  vvjvmm8d),
z2.);
    vvjvmon8 = vvjvmm8c;
    
put vvjvmon8=;
    
%global vvjvmon8;
    
call symput('vvjvmon8', vvjvmon8);
 
    vvjvmm6c =    put(year( vvjvmm8d),
z4.)
               || put(month(vvjvmm8d),
z2.);
    vvjvmon6 = vvjvmm6c;
    
put vvjvmon6=;
    
%global vvjvmon6;
    
call symput('vvjvmon6', vvjvmon6);
 
    
/* End-Schritt4: Vor-Vor-Monat minus 12 Monate ergibt       */
    
/*               1. Tag im Vor-Vor-Monat im Vor-Jahr        */
    
/*               intnx(..) geht nur mit SAS-date-Variable   */
    
vjvvmm6d = intnx( 'month', vvormm6d, -12 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vjvvmm6c =    put(year( vjvvmm6d), z4.)
               || put(month(vjvvmm6d),
z2.);
    vjvvmon6 = vjvvmm6c;
    
put vjvvmon6=;
    
%global vjvvmon6;
    
call symput('vjvvmon6', vjvvmon6);  
 
    
/* End-Schritt5: Akt-Tag minus 12 Monate ergibt             */
    
/*               1. Tag im (akt.) Monat im Vor-Jahr         */
    
/*               intnx(..) geht nur mit SAS-date-Variable   */
    
vjjamm8d = intnx( 'month', aktmm8d, -12 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vjjamm8c =    put(year( vjjamm8d), z4.)
               || put(month(vjjamm8d),
z2.)
               || put(day(  vjjamm8d),
z2.);
    vjjamon8 = vjjamm8c;
    
put vjjamon8=;
    
%global vjjamon8;
    
call symput('vjjamon8', vjjamon8);  
 
    vjjamon6 =    put(year( vjjamm8d),
z4.)  
               || put(month(vjjamm8d),
z2.);
    
put vjjamon6=;
    
%global vjjamon6;
    
call symput('vjjamon6', vjjamon6);  
 
    
/* End-Schritt6: ... minus 1Quartal ergibt das Vor-Quartal  */
    
/*              intnx(..) geht nur mit SAS-date-Variable    */
    
vorqq8d = intnx( 'qtr', aktmm8d, -1 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vorqtr6  =    put(year( vorqq8d), z4.)
               || put(qtr(  vorqq8d),
z2.)
               ;
    
put vorqtr6=;                      
    
%global vorqtr6;
    
call symput('vorqtr6', vorqtr6);  
 
    
/* End-Schritt6.1: Vor-Quartal minus 4 Quartale ergibt      */
    
/*               1. Tag im Vor-Quartal im Vor-Jahr          */
    
/*               intnx(..) geht nur mit SAS-date-Variable   */
    
vjjvqq8d = intnx( 'qtr', vorqq8d, -4 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vjjvqq6c =    put(year( vjjvqq8d), z4.)
               || put(qtr(  vjjvqq8d),
z2.)
               ;
    vjjvqtr6 = vjjvqq6c;
    
put vjjvqtr6=;
    
%global vjjvqtr6;
    
call symput('vjjvqtr6', vjjvqtr6);  
 
    
/* End-Schritt7: Vor-Jahr                                   */
    
/*              intnx(..) geht nur mit SAS-date-Variable    */
    
voryy8d = intnx( 'year', aktmm8d, -1 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
voryy6c =     put(year( voryy8d), z4.)
               || put(month(voryy8d),
z2.)
               ;
    voryy6 = voryy6c;
    
put voryy6=;              
    
%global voryy6;
    
call symput('VORYY6', voryy6);   
 
    voryy4 =      put(year( voryy8d),
z4.)  
               ;
    
put voryy4=;                   
    
%global voryy4;
    
call symput('VORYY4', voryy4);
 
    
/* End-Schritt7.1: Vor-Vor-Jahr                             */
    
/*              intnx(..) geht nur mit SAS-date-Variable    */
    
vvoryy8d = intnx( 'year', aktmm8d, -2 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vvoryy6c =    put(year( vvoryy8d), z4.)
               || put(month(vvoryy8d),
z2.)
               ;
    vvoryy6  = vvoryy6c;
    
put vvoryy6=;       
    
%global vvoryy6;
    
call symput('VVorYY6', vvoryy6);  
 
    vvoryy4 =      put(year(vvoryy8d),
z4.)
               ;
    
put vvoryy4=;                      
    
%global vvoryy4;
    
call symput('VVORYY4', vvoryy4);  
 
    
/* End-Schritt8.1: Ende der Vorwoche                  */
    
/*                 (Wochen-Ende=Samstag [letzter Arbeitstag]) */
    
/* End-Schritt8.2: Anf. der Vorwoche                          */
    
/*                 (Wochen-Anf.=Montag  [erster  Arbeitstag]) */
    
/*                 intnx(..) geht nur mit SAS-date-Variable   */
 
    
/* Anfang der Vorwoche (bei SAS: Wochen-Anfang=Sonntag)    */
    
vorkwa_d = intnx( 'week', aktdatum, -1 );
 
    
/* Anfang der Vorwoche (Wochen-Anf.=Montag  [erster Arb.Tag]) */
    
vorkwaXd = intnx( 'day',  vorkwa_d, +1 );
 
    
/* Ende   der Vorwoche: Wochen-Ende=Samstag [Sa=letzter ArbTag */
    
vorkwe_d = intnx( 'day',  vorkwa_d, +6 );
 
    vorkwa_c =    put(year( vorkwaXd),
z4.)
               || put(month(vorkwaXd),
z2.)
               || put(day(  vorkwaXd),
z2.);
    
put vorkwa_c=;      
    
%global vorkwa8;
    
call symput('vorkwa8', vorkwa_c);
 
    vorkwe_c =    put(year( vorkwe_d),
z4.)
               || put(month(vorkwe_d),
z2.)
               || put(day(  vorkwe_d),
z2.);
    
put vorkwe_c=;                     
    
%global vorkwe8;
    
call symput('vorkwe8', vorkwe_c);
 
    
/* Anfang   der Vor-Vor-Vorwoche                    */
    
vvvkwe_d = intnx( 'day',  vorkwa_d, -20 );
    vvvkwe_c =    put(year( vvvkwe_d),
z4.)  
               || put(month(vvvkwe_d),
z2.)
               || put(day(  vvvkwe_d),
z2.);
    
put vvvkwe_c=;                         
    
%global v4kwa8;
    
call symput('v4kwa8', vvvkwe_c);
 
    
/* Ende   der Vorwoche                                         */
    
/* VORKWFR8 für VorWochen-Ende=Freitag [Fr=letzter Arbeitstag] */
    
vorkwfrd = intnx( 'day',  vorkwa_d, +5 );
 
    vorkwfrc =    put(year( vorkwfrd),
z4.)
               || put(month(vorkwfrd),
z2.)
               || put(day(  vorkwfrd),
z2.);
    
put vorkwfrc=;
    
%global VORKWFR8;
    
call symput('VORKWFR8', vorkwfrc);
 
  
/* Ende   der Vorwoche                                      */
    
/* VORKWSA8 für VorWochen-Ende=Samstag [Sa=letzt. Arb.Tag */
    
vorkwsad = intnx( 'day',  vorkwa_d, +6 );
 
    vorkwsac =    put(year( vorkwsad),
z4.)
               || put(month(vorkwsad),
z2.)
               || put(day(  vorkwsad),
z2.);
    
put vorkwsac=;
    
%global VORKWSA8;
    
call symput('VORKWSA8', vorkwsac);
 
    
/* Ende   der Vorwoche                                     */
    
/* VORKWSO8 für VorWochen-Ende=Sonntag [So=letzt. Arb.Tag  */
    
vorkwsod = intnx( 'day',  vorkwa_d, +7 );  
 
    vorkwsoc =    put(year( vorkwsod),
z4.)   
               || put(month(vorkwsod),
z2.)
               || put(day(  vorkwsod),
z2.);
    
put vorkwsoc=;
    
%global VORKWSO8;
    
call symput('VORKWSO8', vorkwsoc);
 
    
/* End-Schritt9: Akt-Tag minus 1 Tag ergibt den              */
    
/*               Vor-ArbeitsTag im "passenden" Monat         */
    
/*               intnx(..) geht nur mit SAS-date-Variable    */
    
/* voratag8 als Vor-ARBEITS-Tag                              */
    
vordd8d = intnx( 'day', aktdatum, -1 );
    
if weekday(vordd8d) = 1  /* weekday = 1 == So, dann 2 Tg zurück */
    
then do;
      vordd8d = intnx(
'day', vordd8d, -2 ); /* erg. Fr == Arb.Tag */
    
end;
    
if weekday(vordd8d) = 7  /* weekday = 7 == Sa, dann 1 Tg zurück */
    
then do;
      vordd8d = intnx(
'day', vordd8d, -1 ); /* erg. Fr == Arb.Tag */
    
end;
    voratag8 =    put(year( vordd8d),
z4.)     
               || put(month(vordd8d),
z2.)
               || put(day(  vordd8d),
z2.);
    
put voratag8=;
    
%global voratag8;            /* Vor-ARBEITS-Tag */
    
call symput('voratag8', voratag8);
 
    
/* End-Schritt11: Vor-Vor-Vor-Jahr  20060102                */
    
/*              intnx(..) geht nur mit SAS-date-Variable    */
    
vvvyy8d = intnx( 'year', aktmm8d, -3 );
    
/* Konvertierung vom SAS-date-Format ins char-Format        */
    
vvvyy6c =    put(year( vvvyy8d), z4.)
               || put(month(vvvyy8d),
z2.)
               ;
    vvvyy6  = vvvyy6c;
    
put vvvyy6=;           
    
%global vvvyy6;
    
call symput('VVVYY6', vvvyy6);
 
    vvvyy4 =      put(year(vvvyy8d),
z4.)   
               ;
    
put vvvyy4=;        
    
%global vvvyy4;
    
call symput('VVVYY4', vvvyy4);
 
  
run;
 
  
%if &TestDatu. ne    /* bei "Test": Ausgabe in Output-Fenster */
  
%then %do;
    
title2 "Doku/Muster der Zeit-Definitionen (Vor-Monat, etc)   ";
    
title3 "                                                     ";
    
title4 "Durch den Macro 'zeiten' stehen folgende automatisch geladene";
    
title5 "Macro-Variablen mit Zeiten zur Verfügung             ";
    
title7 "Im Beispiel gilt:                                    ";
    
title8 "     TestDatu= &TestDatu. (akt. Tag im Beispiel)     ";
    
title9 "                                                     ";
 
 
    
data _null_;
      
file print;                /* Ausgabe in Output-Fenster */
      
put "aktyy4   ist &aktyy4.  " "    "  "akt. Jahr zu akt. Datum                                             ";
      
put "vormon8  ist &VORMON8. " " "     "Vor-Monat, im 'passenden Jahr', mit LETZTEM Tag im Monat            ";
      
put "vormon6  ist &VORMON6. " "   "   "Vor-Monat, im 'passenden Jahr'                                      ";
      
put "vvormon6 ist &VVORMON6." "    "  "Vor-Vor-Monat, im 'passenden Jahr'                                  ";
      
put "vjjvmon8 ist &VJJVMON8." "  "    "Vor-Monat, im Vor-Jahr, mit 1. Tag im Monat                         ";
      
put "vjjvmon6 ist &VJJVMON6." "    "  "Vor-Monat, im Vor-Jahr                                              ";
      
put "vvjvmon6 ist &VVJVMON6." "    "  "Vor-Monat, im Vor-Vor-Jahr                                          ";
      
put "vjvvmon6 ist &VJVVMON6." "    "  "Vor-Vor-Monat, im Vor-Jahr                                          ";
      
put "vjjamon8 ist &VJJAMON8." "  "    "Monat, im Vor-Jahr, mit 1. Tag im Monat                             ";
      
put "vjjamon6 ist &VJJAMON6." "  "    "  Monat, im Vor-Jahr                                                  ";
      
put "                       "         "(AnwendungsBsp: von &VJJAMON6. bis &VORMON6. sind genau 12 Monate)  ";
      
put "vorqtr6  ist &VORQTR6. " "   "   "Vor-Quartal, im 'passenden Jahr'                                    ";
      
put "vjjvqtr6 ist &VJJVQTR6." "    "  "Vor-Quartal, im Vor-Jahr                                            ";
      
put "voryy6   ist &voryy6.  " "  "    "Vor-Jahr, mit 1. Monat im Jahr                                      ";
      
put "voryy4   ist &voryy4.  " "  "    "  Vor-Jahr                                                            ";
      
put "VORKWa8  ist &VORKWa8. " " "     "Vor-Woche, erster  Arbeits-Tag==Anfang der Vorwoche                 ";
      
put "                       "         "(wenn Wochen-Anf.=Montag [erster Arbeitstag])               ";
      
put "VORKWe8  ist &VORKWe8. " " "     "Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche                   ";
      
put "                       "         "(wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])";
      
put "VORKWFR8 ist &VORKWFR8." " "     " Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche                   ";
      
put "                       "         "(wenn Wochen-Ende=Freitag [Fr=letzter Arbeitstag])       ";
      
put "VORKWSA8 ist &VORKWSA8." " "     " Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche                   ";
      
put "                       "         "(wenn Wochen-Ende=Samstag [Sa=letzter Arbeitstag])";
      
put "VORKWSO8 ist &VORKWSO8." " "     " Vor-Woche, letzter Arbeits-Tag==Ende der Vorwoche                   ";
      
put "                       "         "(wenn Wochen-Ende=Sonntag [So=letzter Arbeitstag])";
      
put "vvoryy4  ist &vvoryy4. " "  "    "   Vor-Vor-Jahr                                                        ";
      
put "vvoryy6  ist &vvoryy6. " "  "    " Vor-Vor-Jahr, mit 1. Monat im Jahr                                  ";
    
run;
  
%end;
%mend zeiten;