Сравнение значений даты в предложении where - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь получить записи текущего месяца из таблицы. Поскольку это будет автоматическая ежемесячная работа, я не могу дать явные значения в предложении where. Поэтому я использую функцию intnx, чтобы получить дату начала и окончания месяца. Затем сравнивая их с табличным значением (дата) в предложении where. Я пробовал разные форматы дат, но каждый раз получаю одну и ту же ошибку: «ОШИБКА: выражение, использующее equals (=), содержит компоненты разных типов данных».

Ниже приведен мой скрипт. Что я делаю не так?

DATA _NULL_;
CALL 
SYMPUT('MonthStart',TRIM(PUT(INTNX('MONTH',TODAY(),0,'B'),ddmmyys10.)));
CALL 
SYMPUT('MonthEnd',TRIM(PUT(INTNX('MONTH',TODAY(),0,'E'),ddmmyys10.)));
RUN;

%PUT &MonthStart.;
%PUT &MonthEnd.;


PROC SQL;
CREATE TABLE CURRENT_MONTH_ACTIVITY AS
SELECT * FROM MONTH_END_BASE
WHERE ACTIVITY_DATE >= '&MonthStart.' AND ACTIVITY_DATE <= '&MonthEnd.' ;
QUIT;

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 ноября 2019

Я согласен с Томом. Вероятно, переменная activ_date является числовым типом с форматом даты, тогда решению присваивается MonthStart, а MonthEnd - числовое значение.

DATA _NULL_;
    CALL SYMPUT('MonthStart',INTNX('MONTH',TODAY(),0,'B'));
    CALL SYMPUT('MonthEnd',INTNX('MONTH',TODAY(),0,'E'));
RUN;

%PUT &MonthStart.;
%PUT &MonthEnd.;



PROC SQL;
CREATE TABLE CURRENT_MONTH_ACTIVITY AS
SELECT * FROM MONTH_END_BASE
WHERE ACTIVITY_DATE >= &MonthStart. AND ACTIVITY_DATE <= &MonthEnd. ;
QUIT;
0 голосов
/ 09 ноября 2019

Вы можете использовать функцию INTCK, чтобы проверить, когда диапазон месяцев от текущей даты до даты активности равен нулю.

where INTCK('MONTH', today(), activity_date) = 0;

Альтернативой может быть использование макроса для 'code-gen''непосредственно between баллов. Вам не нужен шаг данных для заполнения макропеременной, которая будет использоваться позже.

Пример:

data have;
  do activity_date = today() - 365 to today() + 365;
    output;
  end;
  format activity_date yymmdd10.;
run;

data want;
  set have;
  where intck('MONTH', today(), activity_date) = 0;
run;

data want;
  set have;
  where activity_date 
    between 
      %sysfunc(INTNX(MONTH, %sysfunc(today()), 0, B)) 
    and
      %sysfunc(INTNX(MONTH, %sysfunc(today()), 0, E)) 
  ;
run;
...