1

我使用宏遇到了 2 个关于 SAS 日期的问题。为了使它更复杂,我坚持使用 2 个我需要使用的特定宏(它是我试图解决的难题的一部分)。

我需要使用的宏是:

%let id=741852
%let month=January February March April May June July August September October November December

我需要生成的输出是不同学科学生的成绩结果。只有通过更改学生的 ID,输出才必须自行更新。

与日期相关的信息仅在我的输出标题中需要。我目前的代码如下:

Title1 "Grade for &firstname &lastname;
Tilte2 "Bithtdate : &bday;
Title3 "ID :&id"
title5 "As of &sysdate, the grades are:"

为了创建 bday 变量,我使用了 a 函数,因为我的数据集中有信息:

CALL SYMPUTX('bday',Birth_date)

目前我的输出标题 2 和 4 如下:

生日:12556

截至 2012 年 11 月 17 日,等级为:

如何使用宏 &month 使两个标题都如下所示:生日:2012 年 1 月 10 日和截至 2012 年 11 月 15 日,等级如下:

(**日期可能看起来不对,但我在法语工作,而且天数早于一个月)

我坚持使用 %SCAN 功能,但如果我取消 ID,它不会更新月份。请帮助:)

4

2 回答 2

2

我不清楚你到底想完成什么,但这里有一个类似的例子。我将语言环境设置为法语以显示日期的格式。

data a;
length firstname lastname $20;
input id firstname $ lastname $ grade birthday :date9. ;
datalines;
741852 Mary Jones 92.3 01Jan1980
654654 Chuck Berry 76.9 02Mar1983
823983 Michael Jordan 81.2 04Apr1965
;
run;

options locale=FR;

%macro printinfo(id, ds);
data _null_;
  set &ds;
  where id=&id;
  put "-----------------------------------";
  put "  Grade for: " firstname lastname;
  put "  Birthday : " birthday nldate.;
  put "  ID       : " id;
  put "  As of &sysdate., the grade is: " grade;
  put "-----------------------------------";
  put " ";
run;
%mend;

option nonotes;
%printinfo(741852,a);
%printinfo(654654,a);
option notes;

这是日志输出

-----------------------------------
  Grade for: Mary Jones
  Birthday : 01 janvier 1980
  ID       : 741852
  As of 20NOV12, the grade is: 92.3
-----------------------------------
7299   %printinfo(654654,a);
-----------------------------------
  Grade for: Chuck Berry
  Birthday : 02 mars 1983
  ID       : 654654
  As of 20NOV12, the grade is: 76.9
-----------------------------------
于 2012-11-21T14:08:10.487 回答
1

在不更改其他代码的情况下,请尝试以下两个title语句:

title2 "Birthdate: %qleft(%sysfunc(putn(&bday,worddatx.)))";
title5 "As of %qleft(%sysfunc(putn(%sysfunc(today()),worddatx.))) the grades are:";

基本上,您的第一个宏变量bday需要使用格式进行格式化WORDDATX。此外,您应该使用系统函数TODAY()来获取当前系统日期,以便您可以根据需要对其进行格式化。

%SYSFUNC宏函数允许您执行其他 SAS 函数,在这种情况下PUTNTODAY(). %QLEFT宏功能修剪前导空白。

于 2012-11-17T20:10:08.180 回答