Цикл между датами - PullRequest
       7

Цикл между датами

0 голосов
/ 28 апреля 2018

Я создал макрос ниже, чтобы сгенерировать несколько наборов данных на основе макроса даты.

%macro pull(date);

proc sql;

create table new&date as 

select * from acct

where date=&date.;

quit;

%mend;

Так что если я хочу создать набор данных для 20170101 20170201 20170301 20170401 20170501, все, что я могу сделать, это использовать ниже макрос

%macro pull(20170101)

%macro pull(20170201)

%macro pull(20170301)

%macro pull(20170401)

%macro pull(20170501)

Сейчас я планирую создать две макропеременные

%let begin=20170101;

%let end =20170501;

и создавать наборы данных на основе начала и конца, используя цикл. Можно ли это сделать? Итак, я пытаюсь сделать так, чтобы в качестве макропеременной была задана начальная и конечная дата, и извлекать записи между начальной и конечной датами из набора данных acct, а также создавать отдельные наборы данных для каждого месяца между начальной и конечной датами

Набор данных примечаний имеет месячные даты для каждого года.

Ниже код, который я пытаюсь

%let beg="01jan2000"d;
%let end="01jan2001"d; 
%macro Test;
%do date=&beg. %to &end.;
proc sql;
create table IPw_&date. as  
select *
from sample
where date=&date. quit;
%end;
%mend;
%Test;

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018
%macro pull(begin,end);
%let i=0;
%let begin=%sysfunc(inputn(&begin,anydtdte9.));
%let end=%sysfunc(inputn(&end,anydtdte9.));
%do %until (&begin=&end);
    %let begin=%sysfunc(intnx(month,&begin,&i));
    %let date=%sysfunc(putn(&begin,yymmddn8.));
    proc sql;
    create table new&date as 
    select * from acct where date=&date.;
    quit;
    %let i=%eval(&i+1);
%end;
%mend;

%pull(20170101,20170501)
0 голосов
/ 28 апреля 2018

Когда информация о дате должна быть выведена из значений, которые не являются значениями даты SAS, вам потребуется input информация, чтобы получить значение даты, и put значения, перебранные для получения желаемого представления без даты.

Этот пример демонстрирует

  • Функция INPUTN для синтаксического анализа аргументов ГГГГММДД в ​​значениях даты с использованием информата ГГММДД8.
  • Функция INTNX для вычисления 1-го числа месяца значений даты
  • Функция PUTN для преобразования значения даты в представление YYYYMMDD с использованием формата YYMMDDN8.
  • % DO% WHILE оператор для итерации
  • Функция INTNX для продвижения переменной итерации к началу следующего месяца

Код

%macro pull(yyyymmdd);
  %local out;

  %let out = pull_&yyyymmdd;

  data &out;
    pull_date = input ("&yyyymmdd", yymmdd8.);
    format pull_date yymmdd10.;
  run;
%mend;

%macro pull_each_month(begin=, end=);
  %local 
    begin_date end_date
    begin_month end_month
    pull_date pull_ymd
  ;

  %put NOTE: &=begin &=end;

  %let begin_date = %sysfunc(inputn(&begin,yymmdd8.));
  %let end_date   = %sysfunc(inputn(&end,yymmdd8.));

  %put NOTE: &=begin_date &=end_date;

  %let begin_month = %sysfunc(intnx(month,&begin_date,0));
  %let end_month   = %sysfunc(intnx(month,&end_date,0));

  %put NOTE: &=begin_month &=end_month;

  %let pull_month = &begin_month;
  %do %while (&pull_month <= &end_month);
    %let pull_ymd = %sysfunc(putn(&pull_month,yymmddn8.));
    %put NOTE: Invoking pull for &=pull_month &=pull_ymd;

    %pull (&pull_ymd)

    %let pull_month = %sysfunc(INTNX(MONTH,&pull_month,1));

  %end;
%mend;

%pull_each_month (
  begin = 20170101
, end   = 20170501
)

%macro pull_each_month(begin=, end=);
  %local 
    begin_date end_date
    begin_month end_month
    pull_date pull_ymd
  ;

  %put NOTE: &=begin &=end;

  %let begin_date = %sysfunc(inputn(&begin,yymmdd8.));
  %let end_date   = %sysfunc(inputn(&end,yymmdd8.));

  %put NOTE: &=begin_date &=end_date;

  %let begin_month = %sysfunc(intnx(month,&begin_date,0));
  %let end_month   = %sysfunc(intnx(month,&end_date,0));

  %put NOTE: &=begin_month &=end_month;

  %let pull_month = &begin_month;
  %do %while (&pull_month <= &end_month);
    %let pull_ymd = %sysfunc(putn(&pull_month,yymmddn8.));
    %put NOTE: Invoking pull for &=pull_month &=pull_ymd;
    %let pull_month = %sysfunc(INTNX(MONTH,&pull_month,1));
  %end;

%mend;

%pull_each_month (
  begin = 20170101
, end   = 20170501
)
...