使用宏来连接sas

时间:2016-07-19 16:26:08

标签: macros sas concatenation

我和我有两个变量

%let End_of_month =%sysfunc(intnx(month,'&sysdate'd,-1,e),yymmdd10.); %stamp =00:00:00

现在,我想创建一个新变量

%time_stamp =' 2016-06-19 00:00:00'

为了制作这个变量,我正在使用带有sysfunc的cat函数

%timestamp =%sysfunc(cat("'","&End_of_month".,"&stamp.","'"));

上面的代码没有给我想要的结果。有人可以告诉我如何使用%sysfunc解决这个问题。

我不确定如何在此语句中使用%str和nstr。请让我知道如何在宏观中解决猫,猫和猫。

由于

3 个答案:

答案 0 :(得分:1)

你最初的2个宏变量是错误的。那么End_of_month应该是这样的

%let End_of_month =%sysfunc(intnx(month,%str(%')&sysdate%str(%'d),-1,e),yymmdd10.);
%put &End_of_month;

OR

%let End_of_month =%sysfunc(intnx(month,%sysfunc(today()),-1,e),yymmdd10.);
%put &End_of_month;

现在以00:00:00 hr:min:sec创建单引号时间戳,以空格作为分隔符的日期,您不必使用基本SAS功能..只需创建变量如下所示

%let timestamp=%str(%')&End_of_month 00:00:00%str(%');
%put &timestamp;

另外,%stamp表示一个宏调用,它有一个定义而不是像你在问题中提到的变量。同样%timestamp = ..这在SAS中是语法错误。%let timestamp = does宏变量创建和%时间戳理想情况下会调用一个名为宏定义的时间戳。我建议阅读SAS宏语言参考。

答案 1 :(得分:0)

您不需要使用函数来连接宏变量。只需在代码中的任何地方扩展它们即可。另请注意,您不需要在宏代码中引用字符串文字。对于宏处理器,一切都是字符串文字。

%let end_of_month=%sysfunc(intnx(month,"&sysdate"d,-1,e),yymmdd10.);
%let time_stamp=&end_of_month 00:00:00;

添加双引号很简单。

%let time_stamp="&end_of_month 00:00:00";

添加单引号很痛苦,因为宏引用未在单引号内解析。您可以尝试使用%bquote(),但之后该值是宏引用的,这可能会造成麻烦。因此,您可能还需要添加%unquote()

%let time_stamp=%unquote(%bquote('&end_of_month 00:00:00'));

我发现使用dequote()函数是引入单引号的简单方法。从外部带有双引号的字符串开始,以便宏引用有效,然后使用%sysfunc(dequote())删除双引号。

%let time_stamp=%sysfunc(dequote("'&end_of_month 00:00:00'"));

答案 2 :(得分:0)

解决此问题的最佳方法(如果您经常这样做)是创建自己的格式来执行此操作。看到这个答案:

https://stackoverflow.com/a/24044451/214994