4

我正在尝试将 SAS 宏变量转换为时间戳并在转换时遇到问题。我正在使用的代码如下所示。

%let date = '03/15/2013';
%put %sysfunc(inputn(&date,datetime26.6));

我得到的错误是

警告:%SYSFUNC 或 %QSYSFUNC 宏函数引用的函数 INPUTN 的参数 1 超出范围。注意:在 %SYSFUNC 函数执行期间无法执行数学运算。操作的结果已设置为缺失值。

如果有人知道这个问题的答案,请告诉我。

4

3 回答 3

3

那不是 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;
于 2013-09-04T13:41:33.767 回答
2

我对在宏变量中使用日期的偏好是将实际数值存储在宏变量中,如果我需要查看/打印格式化的值,然后动态为其分配格式:

%let date = %sysfunc(mdy(3,15,2013));
%put %sysfunc(putn(&date,date9.));

这使您可以在下面的比较中使用它(我发现这是最常见的任务):

data xx;
  set something;
  where datefield = &date;
run;
于 2013-09-04T14:34:00.310 回答
2

乔基本上是正确的。如果您想要 2013 年 3 月 15 日午夜的日期时间字符串,请使用

%let date = 03/15/2013;
%put %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0)),datetime26.));

只需在日期字符串上使用 PUTN 将日期“转换”为日期时间,就会将纪元 (01JAN1960) 的天数转换为纪元的秒数​​。

于 2013-09-04T14:08:59.720 回答