I have need to use a macro variable within a macro name. (Sounds crazy, I know, and it borders on writing "write-only code", but it is a legitimate need.) Not knowing if this was possible, I wrote the following program:
* Can I use a macro variable inside a macro name? ;
* This would allow me to iterate through a series of macros. ;
%macro mac1;
%put mac1 was executed;
%mend mac1;
%macro mac2;
%put mac2 was executed;
%mend mac2;
%macro mac3;
%put mac3 was executed;
%mend mac3;
%macro main;
%do i = 1 %to 3;
%mac&i;
%end;
%mend main;
%main;
Output was as I had hoped:
mac1 was executed
mac2 was executed
mac3 was executed
So the answer to my question is Yes.
Wednesday, August 13, 2014
Tuesday, August 12, 2014
SAS: Number of hours between two DATETIME variables.
I tried several methods to get the number of hours between two DATETIME variables, but they were wrong. Then I stumbled upon this: http://support.sas.com/kb/24/585.html
/* Sample 1 - Calculate the difference between two SAS dates */
/* */
/* A SAS date value represents the number of days between January 1, */
/* 1960 and the specific date. To produce the difference in days */
/* between two SAS date values, take the more recent date and subtract */
/* the other date. */
data dates;
/* Date constant syntax -- 'ddmmmyy'd */
date1='19Jul2000'd;
date2='19Jan2000'd;
days=date1-date2;
put "Difference in " days=;
run;
/* Sample 2 -- Calculating the difference between two SAS datetimes */
/* */
/* A SAS datetime value represents the number of seconds since */
/* midnight of January 1, 1960 and the specified datetime. To */
/* produce the difference in seconds between two SAS datetime values, */
/* take the greater of the two datetime values and subtract the other */
/* datetime. To convert the difference in seconds to represent the */
/* difference in hours, divide the difference in seconds by 3600 */
/* (60 seconds x 60 minutes) and use the ROUND function to round the */
/* value up to the nearest hour. To convert the difference in seconds */
/* to represent the difference in days, divide the difference in */
/* seconds by 86400 (60 seconds x 60 minutes x 24 hours) and use the */
/* ROUND function to round the value up to the nearest day. */
data datetime;
/* Datetime constant syntax -- 'ddmmmyy:hh:mm:ss<.s>'dt */
dtime1='01Jun2000:08:00:00'dt;
dtime2='31May2000:16:00:00'dt;
seconds=dtime1-dtime2;
hours=round((dtime1-dtime2)/3600);
days=round((dtime1-dtime2)/86400);
put "Difference in " seconds= ;
put "Difference in " hours= ;
put "Difference in " days= ;
run;
Subscribe to:
Posts (Atom)