我已經修改了代碼,稍微讓我們可以看到它的生產日期,在過去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