为什么MAX函数会删除proc sql中的SAS变量格式?

时间:2012-10-02 14:15:44

标签: sas proc-sql

请考虑以下事项:

data; 
format x datetime19.;
x=datetime();
flag='FIRST';
do x=datetime() to x+10 by 1;
    output;
    flag='';
end;
proc sql noprint;
select x into : test1 from &syslast where flag='FIRST';
select max(x) into: test2 from &syslast;
%put now we see that &test1 is in a different format to &test2;

data _null_;  set;
put x=; /* formatted */
call symput('test3',x);
call symput('test4',max(x,sum(x+1000)));
stop;
run;
%put The data step is more consistent - &test3 = &test4;

似乎与我不一致。为什么proc sql在这种情况下保留格式?这种行为是否记录在案?

2 个答案:

答案 0 :(得分:3)

SAS无法知道如何格式化函数的结果。在这种情况下,您的max()函数只是返回一个日期时间,但如果内部有嵌套函数或算术,该怎么办?因此,SAS仅将其视为全新变量,默认情况下不设置格式。如果您想对其应用相同的格式,可以将代码更改为:

select max(x) format=datetime19. into: test2 from &syslast;

答案 1 :(得分:2)

在您的示例中,MAX函数会创建一个新列,在创建新列时,您需要指定所有列属性。因此,只需在select语句中添加FORMAT子句:

proc sql noprint;
    select x into : test1 from &syslast where flag='FIRST';
    select max(x) format=datetime19. into: test2 from &syslast;
quit;
%put now we see that &test1 is in a different format to &test2;