我已经修改了代码,稍微让我们可以看到它的生产日期,在过去30天的结果:
测试代码:
data _null_;
do newdate = date() -30 to date();
d1 = weekday(newdate);
if d1 = 1 then d1 = 8;
enddate = newdate + (8-d1) ;
format newdate enddate date7.;
put newdate= d1= enddate=;
end;
run;
输出:
newdate=25JUL16 d1=2 enddate=31JUL16
newdate=26JUL16 d1=3 enddate=31JUL16
newdate=27JUL16 d1=4 enddate=31JUL16
newdate=28JUL16 d1=5 enddate=31JUL16
newdate=29JUL16 d1=6 enddate=31JUL16
newdate=30JUL16 d1=7 enddate=31JUL16
newdate=31JUL16 d1=8 enddate=31JUL16
newdate=01AUG16 d1=2 enddate=07AUG16
newdate=02AUG16 d1=3 enddate=07AUG16
newdate=03AUG16 d1=4 enddate=07AUG16
newdate=04AUG16 d1=5 enddate=07AUG16
newdate=05AUG16 d1=6 enddate=07AUG16
newdate=06AUG16 d1=7 enddate=07AUG16
newdate=07AUG16 d1=8 enddate=07AUG16
newdate=08AUG16 d1=2 enddate=14AUG16
所以我们可以看到,数学基本上是计算给定的一周的结束假设星期一开始星期几,星期日结束。好消息是,使用intnx()
函数和移位间隔来计算这种方法要简单得多。这种方法也可以在SQL语句中使用。
更好:
data _null_;
do newdate = date() -30 to date();
week_start = intnx('week.2', newdate, 0, 'beginning');
week_end = intnx('week.2', newdate, 0, 'end');
format week_start week_end date7.;
put week_start= week_end=;
end;
run;
上面的代码循环在过去的30天。对于每个日期,它会在日期中添加0
个星期,然后返回星期间隔的开始日期或星期间隔的结束日期。我们定义我们的星期从星期一开始,使用2的“移位”(即week.2
表示星期一从星期一开始,而不是默认的星期日)。
输出:
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=25JUL16 week_end=31JUL16
week_start=01AUG16 week_end=07AUG16
的proc means
代码基本上转化为SQL中的以下内容:
proc sql noprint;
create table a2 as
select col1, col2, enddate, sum(count) as count
from a1
group by 1,2,3
;
quit;
感谢您对总和= – Bee
解释@ user6754080你可能想看看在support.sas.com上的SAS文档,它可能会有所帮助。 –
@data_null_谢谢。是的,我正在阅读文档 - 这是我如何理解很多代码。我得到的总和=我无法找到信息,以及我认识到的某些日期转换是特定于此程序的。 – Bee