SAS宏观变量条款

时间:2016-10-31 17:58:27

标签: macros sas where

这很可能是一个简单的问题,但我还没有弄清楚。

我需要从DATE属于6个月范围的SAS数据集中检索一些数据(例如01JAN2017到30JUN2017)我尝试运行以下代码,但是会导致错误。有什么想法吗?我确定这很简单...

%let start1 = %Sysfunc( InputN( 01JAN2017 , Date9. ) ) ;
%let start2 = %sysfunc(putN(&start1, date9));
%put start1 &start1 start2 &start2;

%let end1 = %sysfunc(inputn(30JUN2017,Date9.));
%let end2 = %sysfunc(putN(&end1, date9));
%put end1 &end1 end2 &end2;

proc print data=ext.account_detail (obs = 10);
    where manufacturer = 'FORD' or product_segment = 'CHRYSLER' 
        and manufacturer_date between &start2 and &end2;
run;

结果是以下错误: 注意:由宏变量" START2"。

生成的行
26          01JAN2017
              _______
              22
              76
ERROR: Syntax error while parsing WHERE clause.
ERROR 22-322: Syntax error, expecting one of the following: !!, *, **, +, -, /, AND, ||.  
ERROR 76-322: Syntax error, statement will be ignored.

2 个答案:

答案 0 :(得分:2)

您将字符串{ "_id" : "yCaqt5nT3LQCBLj8j", "fellowTitle": "Fellow Title" "isVerified" : true } 放入宏变量START2中,然后尝试在WHERE语句中使用它,而不先将其转换为实际日期值。

如果您希望以这种方式格式化宏变量,请在WHERE语句中使用日期文字语法。

01JAN2017

答案 1 :(得分:0)

这完全是另一个方向,但intnx函数非常适合此任务。它允许您按您选择的间隔增加时间。语法为intnx('interval', fromdate, num_periods, 'alignment')

一些例子:

intnx('month', '20FEB17'd, 0, 'beg') will return 01FEB2017

intnx('month', '20FEB17'd, 2, 'end') will return 30APR2017

intnx('month', '20FEB17'd, -1, 'beg') will return 01JAN2017

在第一种情况下,SAS读取20FEB17作为输入,将其移动零个月,并返回该周期的开始。在第二个示例中,它将我们的输入日期向前移动两个月,并返回该周期的结束。在最后一个例子中,我们看到我们能够在输入日期前一个月向后移动。

在你的特定情况下,你会写一些像...... manufacturer_date between '01JAN17'd and intnx('month', '01JAN17'd, 5, 'end')

请注意,有点违反直觉,我们只需要转移五个月来捕获一个六个月的窗口。这是因为'结束'对齐给了我们最后一个月。换句话说,JAN - > FEB - > MAR - > APR - > MAY - > JUN需要5个步骤。另请注意,我只给出了每月轮班的例子。 SAS还允许每年轮班,半年轮班,甚至可以在必要时编制自定义区间。