这很可能是一个简单的问题,但我还没有弄清楚。
我需要从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.
答案 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还允许每年轮班,半年轮班,甚至可以在必要时编制自定义区间。