Не уверен, для чего вы планируете использовать макропеременные, но вы используете дополнительный вызов %SYSFUNC()
. Вам не нужно вызывать PUTN()
для форматирования значения, %SYSFUNC()
уже примет спецификацию формата.
%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b),yymmddn8.);
%let three_year_end=%sysfunc(today(), yymmddn8.);
Таким образом, вы получите такие значения, как 20160101
и 20190123
. Примечание для SAS, если вы не заключите их в кавычки, они будут обрабатываться как числа 20 160 101 и 20 190 123, а не как значения даты или времени. И если вы заключите их в кавычки, они будут просто строками.
Если вы хотите просто сгенерировать значение даты, не пытайтесь форматировать числа. Затем вы получите значения, такие как THREE_YEAR_START=20454
и THREE_YEAR_END=21572
, которые представляют количество дней с 1960 года. Затем в вашем коде SQL вы можете использовать их. Но сначала вам нужно преобразовать значение datetime в значение date. В противном случае вы сравниваете яблоки и апельсины (секунды и дни).
%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b));
%let three_year_end=%sysfunc(today());
...
where datepart(Week_Start_Date) between &three_year_start and &three_year_end
Или вы можете отформатировать ваши макропеременные так, чтобы они выглядели как значения, понятные информату DATE (или DATETIME), и использовать их в качестве литералов даты (или даты / времени), добавляя кавычки и соответствующие суффиксные буквы.
ДАТА Литералы
%let three_year_start=%sysfunc(intnx(year,%sysfunc(today()),-3,b),date9.);
%let three_year_end=%sysfunc(today(), date9.);
...
where datepart(Week_Start_Date) between "&three_year_start"d and "&three_year_end"d
Литералы DATETIME
%let three_year_start=%sysfunc(intnx(dtyear,%sysfunc(datetime()),-3,b),datetime19.);
%let three_year_end=%sysfunc(datetime(), datetime19.);
...
where Week_Start_Date between "&three_year_start"dt and "&three_year_end"dt