2016-07-19 98 views
0

我這裏有兩個變量串聯在SAS使用宏

%let End_of_month =%sysfunc(intnx(month,'&sysdate'd,-1,e),yymmdd10.); %stamp =00:00:00

現在,我想創建一個新的變量

%TIME_STAMP =「2016年6月19日00:00: 00'

爲了使這個變量,我使用的貓函數sysfunc

%timestamp =%sysfunc(cat("'","&End_of_month".,"&stamp.","'")); 

上面的代碼沒有給我想要的結果。有人可以告訴我如何使用%sysfunc解決此問題。

我不太確定如何在這個語句中使用%str和nstr。請讓我知道我們如何在宏觀上解決貓,貓和貓咪。

謝謝

+0

嘗試添加 'DT' 修飾符%時間戳=%sysfunc(貓( 「 '」, 「&End_of_month」, 「&郵票」, 「' DT」));如果你想用文本中的日期代碼 –

+0

你需要引號嗎?宏代碼將把這些視爲字符串的一部分。如果需要它們,你是否真的需要使用單引號?單引號可以抑制宏表達式的評估。如果你使用雙引號,那麼你可以評估你的宏變量。 – Tom

+0

你可能不應該使用'&sysdate'。這是SAS會話開始的日期(不一定是當前日期)。您可能想使用'%sysfunc(date())'獲取當前日期。 –

回答

1

你最初的2個宏變量是錯誤的。然後End_of_month而應是這樣的

%let End_of_month =%sysfunc(intnx(month,%str(%')&sysdate%str(%'d),-1,e),yymmdd10.); 
%put &End_of_month; 

OR

%let End_of_month =%sysfunc(intnx(month,%sysfunc(today()),-1,e),yymmdd10.); 
%put &End_of_month; 

現在來到創建一個單引號時間戳與00:00:00小時:分:秒AFTE日期與空間作爲分隔符,你不必使用基地SAS功能..只需創建類似下面

%let timestamp=%str(%')&End_of_month 00:00:00%str(%'); 
%put &timestamp; 

此外,%的印花稅意味着,就像你在你的闕提到其中有一個定義,而不是一個變量宏調用變量stions .. similar%timestamp = ..這在SAS中是語法錯誤..%let timestamp =做宏變量創建和%timestamp理想情況下會調用一個名爲宏定義的時間戳..我建議您閱讀SAS宏語言參考。

+0

謝謝你的壽司,爲你的答案。我肯定會閱讀宏語言 –

0

您不需要使用函數來連接宏變量。只需在代碼中隨時隨地擴展它們即可。還要注意,你不需要在宏代碼中引用字符串文字。宏處理器的一切都是字符串文字。

%let end_of_month=%sysfunc(intnx(month,"&sysdate"d,-1,e),yymmdd10.); 
%let time_stamp=&end_of_month 00:00:00; 

添加雙引號很簡單。

%let time_stamp="&end_of_month 00:00:00"; 

添加單引號是一種痛苦,因爲宏引用不在單引號內部解析。你可以嘗試使用%bquote(),但是這個值是宏引用的,這會造成麻煩。因此,您可能還需要添加%unquote()

%let time_stamp=%unquote(%bquote('&end_of_month 00:00:00')); 

我已經使用dequote()功能發現是引入單引號的簡單方法。從外部使用雙引號的字符串開始,以便宏引用可以正常工作,然後使用%sysfunc(dequote())刪除雙引號。

%let time_stamp=%sysfunc(dequote("'&end_of_month 00:00:00'")); 
+1

實際上 - 它們要求的格式(帶有單引號)是SQL Server和mySQL數據庫在使用ODBC直通時通常需要的格式。所以報價是必需的,並且它們必須是單引號。 –

+0

當然,但與如何「連接」宏變量值相比,這是一個不同的問題。 – Tom

+0

感謝大家解決這個問題。謝謝 –