Преобразовать буквенный параметр даты в значение даты SAS в макросе - PullRequest
4 голосов
/ 21 апреля 2011

Я хочу создать макрос SAS, который принимает в качестве параметра буквальную дату (например, '31may2011'd).Внутри макроса я хочу преобразовать это в значение даты SAS (например, 18778).

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = ???;  /* how to calculate this value ? */  
%mend;  
%transLiteralDate2Value(literal='31may2011'd);

Является ли элегантный способ достичь этого?Конечно, я мог бы сделать это, анализируя буквальную строку, но я думаю, что должен быть лучший способ.

Я использую SAS 9.1.3

Ответы [ 3 ]

3 голосов
/ 26 апреля 2011

Это будет работать внутри или снаружи макроса. Не забывайте, что% sysfunc () имеет удобный дополнительный второй параметр, который позволит вам форматировать выходное значение.

%let report_date = %sysfunc(sum('01JAN2011'd),best.);

или

%let report_date = %sysfunc(putn('01JAN2011'd,best.));

Приветствие Rob

2 голосов
/ 22 апреля 2011

Удобно иметь пару простых макросов преобразования, как у меня ниже. Смотри также мои сообщения sas-l .

%macro date2num(date, informat=anydtdte.);
  %*-- strip quotations and postfix d from date literal if any. --*;
  %*-- quotations are intentionally doubled to prevent unmatched error --*;
  %let date=%sysfunc(prxchange(s/[''""]d?//i,-1,&date));
  %sysfunc(inputn(&date,&informat))
%mend  date2num;

%macro num2date(num, format=date10., literal=1);
  %local n;
  %let n = %sysfunc(putn(&num,&format));
  %if &literal %then "&n"d; %else &n;
%mend  num2date;
2 голосов
/ 21 апреля 2011

Вы можете сделать это с помощью функции макроса% sysfunc.

%macro transLiteralDate2Value(literal=);  
  %put literal = &literal.;  
  %put sasdatavalue = %sysfunc(putn(&literal.,8.));
%mend;
%transLiteralDate2Value(literal='31may2011'd);
...