Формат ввода даты ГГГГММДД - PullRequest
1 голос
/ 30 марта 2019

Мне нужно ввести даты в формате ГГГГММДД и создать из этих дат макропеременные для использования в предложении WHERE. ФИНАЛЬНЫЙ набор данных должен выбрать одну запись из 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 голосов
/ 30 марта 2019

Чтобы использовать ваши макропеременные в качестве значений даты, вам нужно либо сгенерировать макропеременные в виде необработанного числа дней, как вы это делали с 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 8-значную дату в порядке YMD плюс четырехзначный год?Или год из четырех цифр плюс дата из восьми цифр в порядке MDY?

0 голосов
/ 30 марта 2019

Вы просто не ссылаетесь на свои макропеременные в последнем шаге данных с правильным синтаксисом.Эти переменные &PY_StartDate и &PY_EndDate - это просто строки после компиляции кода макроса, и вам нужно ссылаться на них как на константы даты.Так что это должно решить проблему:

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

В будущем я рекомендую включить options mprint; в начале вашего кода.Эта опция отображает текст, сгенерированный выполнением макроса в вашем журнале, что может очень помочь при отладке макросов.

...