2014-02-17 117 views
1

我想创建一个SAS宏,为今年和去年以及上个月的月份编号创建符号。到目前为止,我有:提取SAS宏中的日期信息

%let LastMonth = %sysfunc(intnx(month,%sysfunc(date()),-1),DATE9.); 
%let ThisMonth = %sysfunc(intnx(month,%sysfunc(date()),0),DATE9.); 
%let ThisYear = %sysfunc(intnx(year,%sysfunc(date()),0),DATE9.); 
%let LastYear = %sysfunc(intnx(year,%sysfunc(date()),-1),DATE9.); 

这些给: %放&LastYear; - > 01JAN2013 %put&ThisYear; - > 01JAN2014 %put&LastMonth; - > 01JAN2014 %put&ThisMonth; - > 01FEB2014

我无法提取的年份和月份的数字,这样& LastMonth我想获得1(一月)和&去年2013等

因为我使用尝试了几个月月()函数:

%let LastMonth = %sysfunc(month(%sysfunc(intnx(month,%sysfunc(date()),-1),DATE9.))); 

但是这给出了一个错误,我不明白为什么它发生是由于:

ERROR: Argument 1 to function MONTH referenced by the %SYSFUNC or %QSYSFUNC macro function is not a number. 
ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC argument list. Execution of %SYSCALL statement or %SYSFUNC or 
    %QSYSFUNC function reference is terminated. 

任何帮助表示赞赏!

+0

Doubel检查'你去年和月宏观分配过程中应用date9.'格式。 – 2014-02-17 15:56:13

回答

1

user102890是正确的 - 你得到了有效尝试执行一个月(01JAN2014),而不是一个月( “01JAN2014” d)。

尝试完全移除格式:

%put %sysfunc(month(%sysfunc(intnx(month,%sysfunc(date()),-1)))); 
+0

谢谢 - 我现在明白为什么我的功能不能正常工作。 – gabnash

1

为了代码可读性和维护性,我建议在sepete数据步骤中创建日期,然后一旦对生成的日期感到满意,就可以轻松创建宏变量。 例如:在以下数据集中,我们设置了若干个日期变量,参考referenceDate,它设置为today();

/*set-up your dates*/ 
data dates; 
referenceDate =today(); 
lastMonth = put(intnx('month', referenceDate, -1), date9.); 
thisMonth = put(intnx('month', referenceDate, 0), date9.); 
thisYear=put(intnx('year', referenceDate, 0), date9.); 
lastYear=put(year(intnx('year', referenceDate, -1)),4.); 
format referenceDate date9.; 
run; 

在上述数据集中的所有日期都将放在一行上。转置上述数据集,我们将得到一个如下所示的数据集:

/*transpose so that the dates you want to macrotise are on a seprate line*/ 
proc transpose data = dates out = date_t (rename = (_name_ =dateType col1=dateValue)); 
var _character_; 
copy referenceDate; 
run; 

referenceDate dateType dateValue 
17Feb2014  lastMonth 01JAN2014 
       thisMonth 01FEB2014 
       thisYear  01JAN2014 
       lastYear  2013 

现在,终于设置了宏。

/*set-up macros*/ 
data _null_; 
set date_t; 
call symputx(dateType, dateValue); 
run; 

%put _user_; 

在日志:

GLOBAL LASTYEAR 2013 
GLOBAL THISYEAR 01JAN2014 
GLOBAL LASTMONTH 01JAN2014 
GLOBAL THISMONTH 01FEB2014