2016-04-14 1 views
1

J'ai besoin de créer 3 tables SAS pour les années, trimestres et mois qui engloberaient une plage désignée à partir de la date d'aujourd'hui. Je crois qu'il ya une façon plus intelligente de le faire, mais je me suis retrouvé avec quelque chose comme (par exemple, si je dois aller 5 ans en arrière):Macro SAS en boucle par date, comment indiquer l'étape correcte?

%macro asd; 

%let today = %sysfunc(today()); 
%let end_year = %sysfunc(intnx(year,&today,-5)); 


proc sql; 
create table years 
(
Years num informat = date9. format = date9. 
); 

insert into years 

%do i = &today. %to &end_year. %by -365; 
%if i = &today.-365 %then %do; 
values(&i.-1) 
%end; 
%else %do; 
values(&i.) 
%end; 
%end; 
; 
quit; 

%mend asd; 
%asd; 
run; 

Le problème est que je ne sais pas comment indiquer une étape dans la boucle comme une période de date, donc je me suis retrouvé avec des chiffres exacts, qui varient (pour l'année - tous les 4 ans, pour le mois - tous les deux mois, pour les trimestres - tous les 16 trimestres).

J'ai ajouté une boucle pendant un an pour essayer de comptabiliser au moins plusieurs années bissextiles, mais cela ne fonctionne pas. Donc avant de passer à des mois et probablement mettre en œuvre une autre boucle imbriquée je voulais demander s'il existe un moyen plus simple de créer de telles tables?

Merci! :)

+0

Pouvez-vous afficher les données que vous souhaitez générer? Des exemples de la façon dont vous souhaitez stocker les périodes de dates vous aideront à expliquer ce que vous essayez de faire. Si vous voulez simplement générer des plages de dates, vous pouvez probablement le faire dans une étape de données et éviter le code macro et SQL. – Tom

Répondre

1

Changez votre boucle pour boucler sur le nombre d'années et calculez la variable de macro nécessaire à l'intérieur de la boucle à la place.

Exemple - version non-macro.

Do I=1 to 5; 
    Year=intnx('year', date, 1); 

     Rest of code; 
End; 
+0

Merci! J'ai réécrit la boucle et cela fonctionne :) '% doi = -1% à -5% par -1; valeurs (% sysfunc (intnx (année, et aujourd'hui., & I.))) % fin; '. – Kvadich