%let months_back = %sysget(months_back);
data;
m = intnx('month', "&sysdate9"d, -&months_back - 2, 'begin');
m = intnx('day', put(m, date9.), 26, 'same');
m2back = put(m, yymmddd10.);
put m2back;
run;
注意:字符值已转换为数字值 给出的地方:(线):(列)。 5:19注意:无效的数字数据'01OCT2012',第5行第19行。
我真的不知道为什么会出错。日期字符串是数字数据吗?
答案 0 :(得分:4)
PUT(m,date9。)是罪魁祸首。 INTNX的第二个参数需要是数字(即日期),PUT函数总是返回一个字符值,在本例中为'01OCT2012'。只需完全取出PUT功能,代码就可以正常工作。
m = intnx('day', m, 26, 'same');
答案 1 :(得分:1)
SAS将日期存储为数字 - 事实上,它们并没有真正独立的类型。 SAS日期是自1960年1月1日以来的天数,因此今天有超过19000天。日期格式与任何日期计算完全无关 - 它仅用于人类可读性。
你说的话:
"&sysdate9"d
实际上将字符串“01JAN2012”转换为数值(18304)。
实际上有一种更快捷的方法来完成你想要做的事情。由于天数与SAS中的整数相对应,要增加一天,您只需在值中添加一个。
例如:
%let months_back=5;
data _null_;
m = intnx('month', today(), -&months_back - 2, 'begin');
m2 = intnx('day', m, 26, 'same');
m3 = intnx('month',"&sysdate9"d, -&months_back - 2)+26;
m2back = put(m2, yymmdd10.);
put m= date9. m2= yymmdd10. m3= yymmdd10.;
run;
M3通过使用MONTH间隔,然后添加26,一步完成整个计算.INTNX('day'...)基本上没有意义,除非使用该函数有其他值(使用移位索引例子)。
您还可以在此处看到在PUT(日志)语句中使用格式 - 您不必将其设置为字符值,然后将其放入日志以获取格式化值,只需将其放入(var )(格式。); - 并按照你想要的方式串起来。
此外,“& sysdate9。”d不是获取当前日期的最佳方式。 &安培; SYSDATE。仅在SAS启动时定义,因此如果您的会话运行3天,您将不会在当天(尽管可能需要这样做?)。相反,无论您的SAS会话运行多长时间,TODAY()函数都会获取当前日期。
最后 - 如果您不想要数据集(如果您确实需要,则命名结果数据集),我建议data _null_;
。 data _null_
不会创建数据集。数据;只需创建越来越多的数据集(data1,data2,...),这些数据集可以快速填满您的工作区,并且很难说出您正在做什么。