The way you are generating the code to push to CALL EXECUTE() will put the raw number of seconds from your DATETIME value into the macro variable. That will actually make your macro easier to write since you won't have to deal with datetime formatted strings.
%macro create_data(Data,date);
%if (&date=.) or (&date=) %then %put NOTE: &=data not processed. ;
%else %do;
%put NOTE: Creating &data for dates on or after &date [%sysfunc(putn(&date,datetime20.))]. ;
data &data. ;
set sample (where=(date>=&date));
run;
%end;
%mend;
options mprint;
data _null_ ;
SET check;
CALL EXECUTE(cats('%nrstr(%create_data)(',data,',',date,')'));
run;
342 options mprint;
343 data _null_ ;
344 SET check;
345 CALL EXECUTE(cats('%nrstr(%create_data)(',data,',',date,')'));
346 run;
NOTE: There were 2 observations read from the data set WORK.CHECK.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds
NOTE: CALL EXECUTE generated line.
1 + %create_data(Data1,.)
NOTE: DATA=Data1 not processed.
2 + %create_data(Data2,1912796120)
NOTE: Creating Data2 for dates on or after 1912796120 [ 11AUG2020:20:15:20].
MPRINT(CREATE_DATA): data Data2 ;
MPRINT(CREATE_DATA): set sample (where=(date>=1912796120));
MPRINT(CREATE_DATA): run;
NOTE: There were 8 observations read from the data set WORK.SAMPLE.
WHERE date>=1912796120;
NOTE: The data set WORK.DATA2 has 8 observations and 2 variables.
... View more