Sas 基于宏变量的INTNX函数

Sas 基于宏变量的INTNX函数,sas,Sas,难以将INTNX功能用于日期逻辑。我创建了以下宏变量- %LET BDATE1 = '2015-07-12';*ACTIVITY BEGIN DATE; 我需要使用这个静态日期(无论当时是什么),并在&BDATE1+7的条件下创建一个附加的宏变量,试图解析'2015-07-19'的值,以便可以在查询中传递它(在DB2环境中RSUBMIT) 我的尝试/假设是,以下内容将提供我在查询中需要传递的内容- DATA _NULL_; %GLOBAL NEWDATE; CALL SYMPUT('NEWDA

难以将INTNX功能用于日期逻辑。我创建了以下宏变量-

%LET BDATE1 = '2015-07-12';*ACTIVITY BEGIN DATE;
我需要使用这个静态日期(无论当时是什么),并在&BDATE1+7的条件下创建一个附加的宏变量,试图解析'2015-07-19'的值,以便可以在查询中传递它(在DB2环境中RSUBMIT)

我的尝试/假设是,以下内容将提供我在查询中需要传递的内容-

DATA _NULL_;
%GLOBAL NEWDATE;
CALL SYMPUT('NEWDATE',PUT(INTNX('DAY',&BDATE1,+7),YYMMDD10.));
RUN;
此执行提供了一个错误-

NOTE: Invalid numeric data, '2015-07-12' , at line 1 column 1.
NOTE: Argument 2 to function INTNX('DAY',.,7) at line 979 column 27 is invalid.
_ERROR_=1 _N_=1

我的假设是,由于我将&BDATE1创建为字符串日期(对于DB2),因此INTNX将其读取为字符。字符串,而不是数值。有人能提出另一种方法/解决方案吗?我试图重新格式化var,但它需要采用字符串格式这一事实导致了另一个问题

问题在于,您正在有效地运行以下代码:

%LET BDATE1 = '2015-07-12';
data _null_;
  oops = INTNX('DAY',&BDATE1,+7);
run;
这是失败的,因为
bdate1
宏变量解析为字符串,而不是日期文字。它没有解析为日期文字,因为您忘记在字符串末尾指定
d
后缀:

%LET BDATE1 = '2015-07-12'd;  /* HAS D SUFFIX */
该更改应足以修复代码

我个人喜欢的处理此类需求的方法是在宏变量中创建一个日期值,并使用%let statemnets进行操作

%let bdate1 = %sysfunc(mdy(7,12,2015));
%let newdate = %sysfunc(intnx(day,&bdate1,7),yymmdd10.);

%put &newdate;
给出:

2015-07-19
这里可以看到的秘密是,
%sysfunc()
函数作为第二个参数,允许您对要返回的值应用格式

编辑:如果您不熟悉
%sysfunc()
函数,最好搜索一些关于它的白皮书。但基本上,它只允许您在宏环境中使用通常在数据步骤中使用的函数。在本例中,我们在
%let
语句中使用它们


我还应该提到,除非特定代码段在
%宏
块中执行,否则不需要使用
%global
语句。在宏之外创建的任何变量实际上都是全局变量。

谢谢!是否有一种简单的方法可以在同一步骤中连接两端的“”,或者我应该单独执行该部分?为什么要添加引号?在使用引号时添加引号,而不是在创建引号时添加引号。