如何基于有数据的最后日期创建SAS日期宏变量
解决方案
方法1:汇总各表最大日期后筛选
- 先创建临时表,存储每张表的最大日期:
/* 创建临时表存储各表的最大日期 */ data max_dates; length table_name $32 max_date date9.; /* 替换成你的6张实际表名 */ do table_name = 'TABLE1', 'TABLE2', 'TABLE3', 'TABLE4', 'TABLE5', 'TABLE6'; /* 动态获取每张表的最大日期 */ call execute(catx(' ', 'proc sql noprint;', 'select max(date_column) into :max_dt from ', table_name, ';', 'quit;' )); max_date = &max_dt.; output; call symdel('max_dt'); end; run;
- 从临时表中筛选出属于上月的最大日期,赋值给宏变量:
/* 定义上月的日历区间:上月第一天到上月最后一天 */ %let first_last_month = %sysfunc(intnx(month,%sysfunc(today()),-1,b), date9.); %let last_cal_last_month = %sysfunc(intnx(month,%sysfunc(today()),-1,e), date9.); proc sql noprint; select max(max_date) into :last_actual_date format=date9. from max_dates where max_date between "&first_last_month."d and "&last_cal_last_month."d; quit; /* 转换成你需要的yymmn6.格式 */ %let last_actual_date_yymm = %sysfunc(putn(&last_actual_date., yymmn6.));
方法2:直接合并查询所有表的上月最大日期
如果6张表的日期字段名一致,可直接用union all合并查询:
proc sql noprint; select max(date_column) into :last_actual_date format=date9. from ( select date_column from TABLE1 union all select date_column from TABLE2 union all select date_column from TABLE3 union all select date_column from TABLE4 union all select date_column from TABLE5 union all select date_column from TABLE6 ) as all_dates where date_column between %sysfunc(intnx(month,%sysfunc(today()),-1,b), date9.)d and %sysfunc(intnx(month,%sysfunc(today()),-1,e), date9.)d; quit; %let last_actual_date_yymm = %sysfunc(putn(&last_actual_date., yymmn6.));
注意事项
- 替换代码中的
TABLE1-TABLE6为你的实际表名,date_column为表中存储日期戳的字段名。 - 如果日期字段是字符型,需先用
input(date_char, yymmdd10.)转换成SAS日期型再处理。
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

