我正在尝试将 SAS 宏变量转换为时间戳并在转换时遇到问题。我正在使用的代码如下所示。
%let date = '03/15/2013';
%put %sysfunc(inputn(&date,datetime26.6));
我得到的错误是
警告:%SYSFUNC 或 %QSYSFUNC 宏函数引用的函数 INPUTN 的参数 1 超出范围。注意:在 %SYSFUNC 函数执行期间无法执行数学运算。操作的结果已设置为缺失值。
如果有人知道这个问题的答案,请告诉我。
那不是 DATETIME,而是 DATE 格式(对于 INPUT,这取决于传入数据,而不是传出数据)。您还需要删除引号,SYSFUNC 将引号视为字符,而不是字符串分隔符。
%let date = 03/15/2013;
%put %sysfunc(inputn(&date,MMDDYY10.));
要实际创建日期时间,您需要使用 PUT:
%let date = 03/15/2013;
%put %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0)),datetime26.));
但是,如果可以的话,更好的方法是使用日期常数......
%let date=15MAR2013;
%put "&date."d;
我对在宏变量中使用日期的偏好是将实际数值存储在宏变量中,如果我需要查看/打印格式化的值,然后动态为其分配格式:
%let date = %sysfunc(mdy(3,15,2013));
%put %sysfunc(putn(&date,date9.));
这使您可以在下面的比较中使用它(我发现这是最常见的任务):
data xx;
set something;
where datefield = &date;
run;
乔基本上是正确的。如果您想要 2013 年 3 月 15 日午夜的日期时间字符串,请使用
%let date = 03/15/2013;
%put %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0)),datetime26.));
只需在日期字符串上使用 PUTN 将日期“转换”为日期时间,就会将纪元 (01JAN1960) 的天数转换为纪元的秒数。