楼主: caibirdcnb
1126 5

[问答] 请问高手在MACRO中日期如何转数字? [推广有奖]

  • 0关注
  • 36粉丝

讲师

47%

还不是VIP/贵宾

-

威望
0
论坛币
1367 个
通用积分
16.5538
学术水平
67 点
热心指数
70 点
信用等级
64 点
经验
6762 点
帖子
206
精华
2
在线时间
433 小时
注册时间
2011-8-31
最后登录
2023-9-23

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
下面程序中,如何让startDate和stopDate变成数字,以便循环?谢谢了!

%macro Main;
%let startDate='15Jul2000'd;
%let stopDate='19Jul2000'd;
%let numOfDays=120;
%do date=?startDate %to ?stopDate;
  proc sql;
   create table nb.date_line as
    select *
    from nb.raw_date_line   
    where "&date"d-&numOfDays<date<="&date"d;
  quit;
%end;
%mend;
%Main





二维码

扫码加我 拉你入群

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

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

关键词:Macro Mac CRO acr proc sql

已有 1 人评分经验 收起 理由
eijuhz + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

沙发
banishurface 学生认证  发表于 2019-7-3 23:02:38 |只看作者 |坛友微信交流群
在循环开始用 call symput定义。一步到位也可以不过这样可读性更高和更易于修改

%macro Main;
%let startDate='15Jul2000'd;
%let stopDate='19Jul2000'd;

data _null_;
call symput('start','15Jul2000'd);
call symput('end','19Jul2000'd);
run;


%let numOfDays=120;
%do date= &start. %to &end.;
  proc sql;
   create table nb.date_line as
    select *
    from nb.raw_date_line   
    where "&date"d-&numOfDays<date<="&date"d;
  quit;
%end;
%mend;
%Main

使用道具

藤椅
banishurface 学生认证  发表于 2019-7-3 23:19:31 |只看作者 |坛友微信交流群
想一步到位试试下面这样
%macro a;

%do i= %sysfunc(putn("15Jul2000"d,best12.)) %to %sysfunc(putn("19Jul2000"d,best12.));
%put %sysfunc(putn(&i.,date9.));
%end;

%mend;

%a;
但是你用这种方式写的代码,别人维护或者读以来会不那么易懂

使用道具

板凳
caibirdcnb 发表于 2019-7-4 14:19:03 |只看作者 |坛友微信交流群
banishurface 发表于 2019-7-3 23:19
想一步到位试试下面这样
%macro a;
感谢高手回复。
但是,第一个程序,两个变量需要分别修改2次。
第二个程序,两个变量没有独立出来,以后修改还要去先定位。

请问有没有办法像我主贴那样,只需要在独立的%let语句里面修改一次?
谢谢!

使用道具

报纸
banishurface 学生认证  发表于 2019-7-4 22:16:47 |只看作者 |坛友微信交流群
/*方法一*/
%let start=15Jul2000;
%let stop=19Jul2000;
%macro Main;

%do i= %sysfunc(putn("&start."d,best12.)) %to %sysfunc(putn("&stop."d,best12.));
%put %sysfunc(putn(&i.,date9.));
%end;

%mend;
%Main



/*方法二*/
%macro a(start=,end=);

%do i= %sysfunc(putn("&start."d,best12.)) %to %sysfunc(putn("&end."d,best12.));
%put %sysfunc(putn(&i.,date9.));
%end;

%mend;

%a(start=15Jul2000,end=19Jul2000);

已有 1 人评分论坛币 学术水平 热心指数 信用等级 收起 理由
admin_kefu + 40 + 2 + 2 + 2 热心帮助其他会员

总评分: 论坛币 + 40  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

使用道具

地板
caibirdcnb 发表于 2019-7-4 23:51:11 |只看作者 |坛友微信交流群

非常感谢楼上的高手!

%macro Main;
%let startDate='15Jul2000'd;
%let stopDate='19Jul2000'd;
%let numOfDays=120;
%do date=%sysfunc(putn(&startDate,best5.)) %to %sysfunc(putn(&stopDate,best5.));
  proc sql;
   create table nb.date_line as
    select *
    from nb.raw_date_line   
    where &date-&numOfDays<date<=&date;
  quit;
%end;
%mend;
%Main

使用道具

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

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

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

GMT+8, 2024-4-20 10:45