2017-06-12 24 views
0

我想用下面的循環來管理三個表之間的動態追加。嵌套的sysfunc +貓+領先的0刪除

然而,嵌套的貓%sysfuncs移除了月和日

會有人如此溫柔解釋什麼是不工作在這裏很好的零?

我期待動態聲明表,例如。

「FTP.TOTAL_4B_20170603」(年月日),而不是像代碼retriving: 「FTP.TOTAL_4B_201763」

data dd; %MACRO H; 
%DO I=1 %TO 2; 
proc append 
base=prod0 
data=FTP.TOTAL_4B_%sysfunc(CATS(%sysfunc(year(%sysfunc(intnx(day,%sysfunc(today()),-&i,s)))), 
%sysfunc(putn(%sysfunc(month(%sysfunc(intnx(day,%sysfunc(today()),-&i,s)))),z2.)), 
%sysfunc(putn(%sysfunc(day(%sysfunc(intnx(day,%sysfunc(today()),-&i,s)))),z2.)))); 
run; 
%end; 
proc sort data=prod0; 
by pan fecha; 
run; 
%MEND H; 
%H; 
run;  

感謝您的幫助 最好成績 d

+1

是,功能的CAT_家族並剝去前導0,這是因爲設計的,因爲它使用的最佳格式自動轉換。要覆蓋默認行爲,您必須明確定義值。其他人建議下面的解決方法,但我想明確回答你的問題。 – Reeza

回答

3

不知道爲什麼你有proc appendproc sort a data步驟,但我認爲下面的宏表達式可以幫助:

%MACRO J; 
    %DO I=1 %TO 2; 
     %put FTP.TOTAL_4B_%sysfunc(intnx(DAY,%sysfunc(today()),-&I.,S),yymmddn8.); 
    %END; 
%MEND J; 
%J; 
0

您可以使用格式來獲​​取日期YYYYMMDD。另外intnx是沒有必要的,如果你打算只在幾天迭代。 date()返回整數,所以你可以很容易地使用加/減法。

%MACRO test; 
    %DO I=1 %TO 2; 
     %let test_date=%sysfunc(putn(%sysfunc(date()) - &i, yymmddn8.)); 
     %put DS name FTP.TOTAL_4B_&test_date; 
    %end; 
%MEND test; 

%test; 

給出結果

1   OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK; 
59   
60   
61   
62   
63   %MACRO test; 
64   %DO I=1 %TO 2; 
65   %let test_date=%sysfunc(putn(%sysfunc(date())-&i, yymmddn8.)); 
66   %put DS name FTP.TOTAL_4B_&test_date; 
67   %end; 
68   %MEND test; 
69   
70   %test; 
DS name FTP.TOTAL_4B_20170612 
DS name FTP.TOTAL_4B_20170611 
71   
72   OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK; 
84