我正在尝试从表中提取数据以涵盖上一个日历月。该报告可以在下个月的任何一天提取。我使用以下代码:
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
答案 0 :(得分:5)
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生成日期值。除了MONTH(前一年,周)之外,间隔可以是很多东西。您甚至可以使用它来确定YEAR.N(其中N是您的会计年度开始的月份)的会计年度。
Data _null_;
Current_FY=year(intnx('year.9',today(),0,'e'));
put current_fy=;
run;
最后一个(可选)参数用于对齐(Beginning,Middle,End或Same)。
答案 1 :(得分:1)
您可以为上个月的第一天和最后一天创建宏变量:
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;