无论如何,是否可以动态更改日期并将其写入SAS中的表中?

时间:2019-04-26 09:50:01

标签: sas

我正在开发一个代码,该代码可以动态获取表并将它们与计算出的日期相关联以进行进一步的计算。 我很难计算这些日期,因为如果我更改开始的唯一参数,它们的值就不会更改。

PS:我选择在数据 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步骤直接在表中执行此操作,但是我需要那些宏变量用于其他目的

1 个答案:

答案 0 :(得分:1)

根据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;