2012-10-02 15 views
1

考慮以下幾點:爲什麼MAX函數去掉proc sql中的SAS變量格式?

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在這種情況下保留格式?此行爲是否記錄在案?

回答

3

SAS無法知道如何格式化函數的結果。在這種情況下,你的max()函數只是返回一個日期時間,但是如果它裏面有嵌套函數或算術的話。因爲SAS只是將它視爲一個全新的變量,默認情況下它沒有設置格式。如果你想相同的格式適用於它,你可以更改您的代碼如下:

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

此外 - 你可以修改理查德宏(http://www.devenezia.com/downloads/sas/macros/index.php?m=samelabl)將格式從一個數據集複製到另一個數據集。 –

+0

功能 - 有道理。解釋數據步驟結果(symput函數) –

2

在您的例子中,MAX函數創建一個新列,並創造新的列時,你需要指定所有列屬性。因此,只需添加一個FORMAT子句SELECT語句:

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;