2016-10-31 193 views
0

這很可能是一個簡單的問題,但我還沒有弄明白。SAS哪裏有宏變量條款

我需要從SAS數據集檢索一些數據,其中DATE落在6個月的範圍內(例如01JAN2017到30JUN2017)我試着運行下面的代碼,但它會導致錯誤。有什麼想法嗎?我敢肯定,這是簡單的東西...

%let start1 = %Sysfunc(InputN(01JAN2017 , Date9.)) ; 
%let start2 = %sysfunc(putN(&start1, date9)); 
%put start1 &start1 start2 &start2; 

%let end1 = %sysfunc(inputn(30JUN2017,Date9.)); 
%let end2 = %sysfunc(putN(&end1, date9)); 
%put end1 &end1 end2 &end2; 

proc print data=ext.account_detail (obs = 10); 
    where manufacturer = 'FORD' or product_segment = 'CHRYSLER' 
     and manufacturer_date between &start2 and &end2; 
run; 

結果是以下錯誤: 注:受宏觀變量「START2」行產生。

26   01JAN2017 
       _______ 
       22 
       76 
ERROR: Syntax error while parsing WHERE clause. 
ERROR 22-322: Syntax error, expecting one of the following: !!, *, **, +, -, /, AND, ||. 
ERROR 76-322: Syntax error, statement will be ignored. 

回答

1

將字符串01JAN2017放入宏變量START2中,然後在WHERE語句中嘗試將其轉換爲我們,而不先將其轉換爲實際的日期值。

如果您希望以這種方式格式化您的宏變量,那麼在您的WHERE語句中使用日期文字語法。

where manufacturer = 'FORD' or product_segment = 'CHRYSLER' 
    and manufacturer_date between "&start2"D and "&end2"D 
; 
0

這完全是另一個方向,但intnx函數非常適合這項任務。它允許您按照您選擇的時間間隔增加時間。語法是intnx('interval', fromdate, num_periods, 'alignment')

的幾個例子:

intnx('month', '20FEB17'd, 0, 'beg') will return 01FEB2017

intnx('month', '20FEB17'd, 2, 'end') will return 30APR2017

intnx('month', '20FEB17'd, -1, 'beg') will return 01JAN2017

在第一種情況下,SAS讀20FEB17作爲輸入,移位它零個月,並返回該週期的開始。在第二個例子中,它將我們的輸入日期向前移兩個月,並返回該期間的結束。在最後一個例子中,我們看到我們能夠及時向後移動,比我們的輸入日期早一個月。

在你的具體情況下,你會寫... manufacturer_date between '01JAN17'd and intnx('month', '01JAN17'd, 5, 'end')

請注意,與直覺相反,我們只需要向前移動五個月以捕捉六個月的窗口。這是因爲'結束'隊伍給了我們最後一個月。換言之,JAN - > FEB - > MAR - > APR - > MAY - > JUN需要5個步驟。另外請注意,我僅舉例說明了每月的班次。 SAS還允許每年輪班,半年輪班,如果有必要,您甚至可以編制自定義時間間隔。