输入日期格式YYYYMMDD

时间:2019-03-30 02:46:36

标签: sas

我需要以YYYYMMDD格式输入日期,并从这些日期创建宏变量以在WHERE子句中使用。 FINAL数据集应从Sales中选择一条记录,但返回0个观察值。

data work.FiscalYear2019;
input @1 fiscalYear $4. @5 StartDate mmddyy8.;
retain diff;
if fiscalYear = '2019' then do;
    tday = today();
    diff = tday - StartDate;
    call symputx('FYTD_days',diff);
    call symputx('CY_StartDate', StartDate);
    call symputx('CY_EndDate', put(today(),mmddyy8.));
end;
else if fiscalYear = '2018' then do;
    PY_EndDate = StartDate + diff;
    call symput('PY_EndDate', put(PY_EndDate,mmddyy8.));
    call symput('PY_StartDate', put(StartDate,mmddyy8.));
end;

datalines;
201912312018
201801012018 
;
data work.Sales;
input @1 fiscalYear $4. @5 orderDate mmddyy8.;
format orderDate mmddyy6.;
datalines;
201902042019
201801012018
;
data final  (WHERE=(orderDate >= &PY_StartDate AND
                   orderDate <= &PY_EndDate));
set Sales;
run;

我希望FINAL数据集包含Sales数据集中的一条记录,但FINAL的观察值为0。

2 个答案:

答案 0 :(得分:0)

您只是没有在最后一个数据步骤中使用正确的语法引用宏变量。这些&PY_StartDate&PY_EndDate变量只是编译宏代码后的字符串,您需要将它们称为日期常量。因此,这应该可以解决问题:

data final  (WHERE=(orderDate >= "&PY_StartDate"d AND
                   orderDate <= "&PY_EndDate"d));
set Sales;
run;

以后,建议您在代码的开头添加options mprint;。此选项在日志中显示由宏执行生成的文本,这对于调试宏有很大帮助。

答案 1 :(得分:0)

要将宏变量用作日期值,您需要像使用CY_StartDate一样将宏变量生成为原始天数值,或者使用DATE格式生成它们并将其括在引号中并附加字母D制作日期文字。

赞:

call symputX('PY_StartDate', put(StartDate,date9.));
call symputX('PY_EndDate', PY_EndDate);
...
data final
  set Sales;
  WHERE orderDate >= "&PY_StartDate"d
   AND  orderDate <= &PY_EndDate
  ;
run;

您的主题行还提到YYYYMMDD信息,并且它不会出现在您的代码中。您是否正确解释了源数据? 201801012018代表YMD顺序中的8位日期加上4位年份吗?还是按MDY顺序排列的四位数年份和八位数日期?

相关问题