SAS Получение всей информации за прошлый месяц (01 - 28/29, 30, 31)? - PullRequest
1 голос
/ 26 марта 2012

Я пытаюсь получить данные из таблицы за последний календарный месяц.Отчет может быть получен в любой день следующего месяца.Я использую следующий код:

CURRENT DATE - 31 DAYS - DAYOFWEEK_ISO(CURRENT DATE) DAYS)

Тем не менее, он извлекает информацию за текущий месяц и т. Д. ... Существует ли переменная или что-то, чтобы гарантировать, что возвращаются только последние данные monts?

Спасибо.

Вот как это сделал один из моих коллег по работе:

CURRENT DATE - DAY(CURRENT DATE) DAYS + 1 DAY - 1 MONTH 
AND CURRENT DATE - DAY(CURRENT DATE) DAYS 

Ответы [ 2 ]

5 голосов
/ 26 марта 2012

Функция INTNX отлично подходит для дат. Вот два примера: одно подмножество с использованием шага данных и другое с использованием Proc SQL.

data dates(drop=i);
 input date:DATE9. @;
 do i = 1 to 4;
  input name $ weight @;
  output;
 end;
 format date mmddyy10.;
 datalines;
 05FEB2012 Barbara 125 Alice 130 Ronald 170 John 160
 04FEB2012 Barbara 122 Alice 133 Ronald 168 John 155
 15FEB2012 Barbara 135 Alice 140 Ronald 190 John 180
 25FEB2012 Barbara 142 Alice 113 Ronald 178 John 185
 29FEB2012 Barbara 185 Alice 170 Ronald 160 John 150
 04MAR2012 Barbara 192 Alice 183 Ronald 178 John 165
;

Data _null_;
 call symputx('beg_dt',intnx('month',today(),-1,'b'));
 call symputx('end_dt',intnx('month',today(),-1,'e'));
run;

Data subset;
 set dates(where=(&beg_dt <= date <= &end_dt));
run;

PROC SQL noprint;
 CREATE TABLE subset_sql AS
 SELECT *
 FROM dates
 WHERE &beg_dt <= date <= &end_dt;
QUIT;

INTNX генерирует значение даты. Интервал может отличаться от МЕСЯЦА (например, ГОД, НЕДЕЛЯ). Вы даже можете использовать его для определения финансового года с помощью YEAR.N (где N - это месяц, когда начинается ваш финансовый год).

Data _null_;
 Current_FY=year(intnx('year.9',today(),0,'e'));
 put current_fy=;
run;

Последний (необязательный) аргумент предназначен для выравнивания (начало, середина, конец или то же самое).

1 голос
/ 26 марта 2012

Вы можете создать макропеременные для первого и последнего дня прошлого месяца:

data _null_;
  latest=input("01"||substr(put(today(),date9.),3),date9.)-1; /* Last day of last month */
  earliest=input("01"||substr(put(latest,date9.),3.),date9.); /* First day of last month */
  call symput('mlatest',put(latest,date9.));
  call symput('mearliest',put(earliest,date9.));
run;
%put First day of last month: &mearliest;
%put Last day of last month:  &mlatest;

Затем использовать эти макропеременные при чтении в вашем наборе данных:

data last_month;
  set all_data(where=("&mearliest"d<=date_var<="&mlatest"d));
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...