楼主: afanms1
1679 3

SAS有中间变量吗? [推广有奖]

  • 0关注
  • 0粉丝

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
30 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2014-7-14
最后登录
2014-7-16

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
麻烦各位大神帮忙看下,第一次用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;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:中间变量 Settlement maturity Holiday Macro 工作日 程序 开发

沙发
freerunning_sky 在职认证  发表于 2014-7-16 19:11:23 |只看作者 |坛友微信交流群
  1. proc sql noprint;
  2.         select put(a.date,12.) into :holi_dt separated by ',' from holiday a
  3.         where isholiday=1;
  4. quit;

  5. data tmp;
  6.         set input;
  7.         enddt=intnx('day',startdt,60);
  8.         do while(put(enddt,12.) in (&holi_dt));
  9.                 enddt=enddt+1;
  10.         end;
  11.         format enddt date9.;
  12. run;
复制代码

使用道具

藤椅
freerunning_sky 在职认证  发表于 2014-7-16 19:13:31 |只看作者 |坛友微信交流群
freerunning_sky 发表于 2014-7-16 19:11
如果只是考虑周六日,那就更加简单,上面是包含节假日的判断程序,如果只是判断周六日,结合weekday()函数和do while循环就可以实现,注意周六返回的weekday是7,周日是1

使用道具

板凳
freerunning_sky 在职认证  发表于 2014-7-16 19:15:02 |只看作者 |坛友微信交流群
如果只是判断周六日,结合weekday()函数和do while循环就可以,上面这段程序是包含节假日的判断在里面。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 23:00