1

次のことを考慮してください。

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がフォーマットを保持するのはなぜですか?この動作は文書化されていますか?

4

2 に答える 2

3

関数の結果がどのようにフォーマットされるべきかを SAS が知る方法はありません。この場合、max()関数は単純に日時を返しますが、ネストされた関数や演算が内部にある場合はどうなるでしょうか。このため、SAS はそれを、デフォルトでフォーマットが設定されていない新しい変数として扱います。同じフォーマットを適用したい場合は、コードを次のように変更できます。

select max(x) format=datetime19. into: test2 from &syslast;
于 2012-10-02T14:35:57.063 に答える
2

あなたの例では、MAX関数は新しい列を作成し、新しい列を作成するときは、すべての列属性を指定する必要があります。したがって、FORMATselect ステートメントに句を追加するだけです。

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;
于 2012-10-02T14:39:12.817 に答える