2016-12-14 104 views
0

我在下面的代碼中試圖轉換壓縮函數。SAS日期宏和壓縮函數

舊代碼:(此代碼的工作,並返回以下結果)

data _null_; 
%let startdt='2015/11/1'; 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

此代碼爲宏變量startdt如2015年11月1日和datenum如2015年11月1日返回值。

我正在嘗試使用宏變量進行日期類似的功能。

新的代碼:(此代碼給我一個錯誤,我無法弄清楚爲什麼)

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
date_num=compress(&startdt,"'"); 
call symputx('date_num',date_num); 
%put &startdt; 
%put &date_num; 
run; 

當我運行這個新的代碼,我得到一個錯誤。我想要得到像舊代碼一樣的結果。 請幫忙。謝謝!

+0

移動你的'%LET'和'%PUT'語句在數據步之前或之後,因爲那是SAS要評估它們時,它使您的代碼更易於閱讀和理解。將它們留在數據步驟的中間使得它看起來像是在數據步驟運行時如何進行評估,這是不正確的。這是否解決了您的問題? – Tom

+0

嗨,這不能解決問題。錯誤出現在沒有let語句的「新代碼」中。謝謝! – PJay

+0

您的第二個數據步驟也應該運行良好,但您需要將'%PUT'語句移至'run;'語句之後。否則,它們會產生一個錯誤,即宏變量不存在,或者更糟糕的是,它們會向您顯示它們在數據步驟運行之前所具有的值。 – Tom

回答

0

您的第一個數據步驟是從宏變量中刪除引號。您可以通過使用%sysfunc()調用compress()函數在宏代碼中執行此操作。甚至只是使用%scan()函數。

%let date_num = %scan(&startdt,1,%str(%')); 

在第二個它看起來像你試圖在日期值上使用INTNX()函數。但是你的宏變量不包含日期值。如果你想把'2015/11/1'視爲一個日期,那麼你將需要使用一個輸入函數來首先進行轉換。

%let last_mth_beg = %sysfunc(intnx(month,%sysfunc(inputn(&date_num,yymmdd10)),-1,b),yymmdd10); 
+0

我添加了舊代碼僅供參考,因爲這是我試圖通過避免日期的硬編碼實現的結果。我嘗試過使用上面的語句,但是我現在正在獲取缺少的值。謝謝! – PJay

+0

代碼正常工作。假設你的宏變量STARTDT的YYYY/MM/DD格式帶有單引號。它將以YYYY/MM/DD格式生成新的宏變量LAST_MTH_BEG,但不包含它的單引號。 – Tom

0

我不知道爲什麼你的舊代碼沒有給你一個錯誤。第一次運行它時,您應該看到錯誤

警告:表面符號引用DATE_NUM未解析。

然後,數據步驟運行後,&DATE_NUM將有一個值。在數據步驟中不能使用%PUT來顯示您在數據步驟中創建的宏變量。

在第二組代碼中,您創建的STARTDT宏變量的值首先沒有單引號。如果你只是運行以下,你會得到正確的結果:

data _null_; 
dt = date(); 
last_mth_beg = intnx('month',dt,-1,'beginning'); 
call symput('startdt',put(last_mth_beg,YYMMDDS10.)); 
run; 

%put &startdt; 

當我運行它,我看到

2016年11月1日