首页 > 解决方案 > 无论如何动态更改日期并将它们写入SAS中的表?

问题描述

我正在编写一个动态获取表格并将它们与计算日期相关联以进行进一步计算的代码。我在计算这些日期时遇到了麻烦,因为如果我更改我开始使用的唯一参数,它们的值不会改变。

PS:我选择在 data null步骤中执行它们,以便可以将它们用于其他查询。

%let dtDMRT= 1FEB2016;
/*calculated dates */
DATA _null_;
DAY_DMRT_DEB = intnx('year',"&dtDMRT"d,-1);
format DAY_DMRT_DEB DATE9.;
call symputx('DAY_DMRT_DEB',DAY_DMRT_DEB);

DAY_DMRT_FIN = '&dtDMRT'd;
format DAY_DMRT_FIN DATE9.;
call symputx('DAY_DMRT_FIN',DAY_DMRT_FIN);

DATE_DMRT_1Y = intnx('year',"&dtDMRT"d,1);
format DATE_DMRT_1Y DATE9.;
call symputx('DATE_DMRT_1Y',DATE_DMRT_1Y);
run;


PROC SQL THREADS ; 
CREATE TABLE DATAMART_SEG AS  
SELECT *,
&DAY_DMRT_DEB as  DAY_DMRT_DEB  format= DATE9.,
&DAY_DMRT_FIN as  DAY_DMRT_FIN  format= DATE9.,
&DATE_DMRT_1Y As DATE_DMRT_1Y  format= DATE9.  
FROM  DMRT.MYDATAMART_&dtDMRT
RUN;

%let dtDMRT= 1JAN2016的第一个测试;我在 WORK.DATAMART_SEG 得到了正确的结果:

DAY_DMRT_DEB = '01JAN2015'd
DAY_DMRT_FIN = '01JAN2016'd
DATE_DMRT_1Y = '01JAN2017'd

如何使用%let dtDMRT= 1FEB2016; 我得到:

DAY_DMRT_DEB = '01JAN2015'd
DAY_DMRT_FIN = '01FEB2016'd
DATE_DMRT_1Y = '01JAN2017'd

我知道我可以使用 PROC SQL 或 DATA 步骤直接在表中执行此操作,但我需要这些宏变量用于其他目的

标签: sas

解决方案


根据 intnx 的文档,对齐的默认值设置为 BEGINNING。所以你观察到的是绝对正确的。将 alingment 设置为 SAME 并且 intnx 会做你想做的事。

DATA _null_;
DAY_DMRT_DEB = intnx('year',"&dtDMRT"d,-1,'SAME');
format DAY_DMRT_DEB DATE9.;
call symputx('DAY_DMRT_DEB',DAY_DMRT_DEB);

DAY_DMRT_FIN = "&dtDMRT"d;
format DAY_DMRT_FIN DATE9.;
call symputx('DAY_DMRT_FIN',DAY_DMRT_FIN);

DATE_DMRT_1Y = intnx('year',"&dtDMRT"d,1,'SAME');
format DATE_DMRT_1Y DATE9.;
call symputx('DATE_DMRT_1Y',DATE_DMRT_1Y);
run;  

推荐阅读