麻烦各位大神帮忙看下,第一次用sas,觉得开发的思路真的很诡异。
想实现一个比较简单的功能。
计算60天后的日期,然后在HOLIDAY表中查询,如果这个日期非工作日,则向过去取工作日。
写了个简单的宏,用了一个中间变量。
结果在数据集中查找的时候,一直提示找不到中间变量。
最后折腾了半天,终于执行成功,但是巨麻烦,具体的程序如下:
%macro intdate(settlement,maturity);
data tmp;
%let intdate=settlement;
if intdate<&maturity
then intdate=INTNX('DAY', &settlement, 60);
else intdate=&maturity;
put intdate yymmdd10.;
set holiday;
format intdate yymmdd10.;
intdate=intdate;
run;
proc sql;
SELECT /* MAX_of_test_date */
(MAX(t1.test_date)) FORMAT=YYMMDD10. AS MAX_of_test_date
FROM tmp t1
WHERE t1.IsWeekEnd = 0 AND t1.test_date <= intdate;
quit;
%mend;
%intdate('01mar2011'd,'01mar2013'd);
难道只能这样么?数据处理的临时变量,应该怎样跟data步结合起来?
还是说压根就不应该这么算,有其他的做法?
holiday的生成:
data work.holiday;
start_date=mdy(1,1,2010);
end_date=mdy(1,2,2020);
days=intck('day',start_date,end_date);
do i = 0 to days by 1;
test_date=intnx('day',start_date,i);
WeekDayStr=WEEKDAY(test_date);
if WeekDayStr = 6 or WeekDayStr = 7
then IsWeekEnd=1;
else IsWeekEnd=0;
format test_date YYMMDD10.;
output ;
end;
run;