как получить макропеременную для оценки математики? - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть следующий фрагмент кода sas marco:

%macro processLink(uuid=, name=, cluster_external_ipaddress=);

 %let unix_starttime = 1000000*(&starttime - '01JAN1970:00:00'dt);
 %let unix_endtime = 1000000*(&endtime - '01JAN1970:00:00'dt);
...

при запуске просто создает переменную в виде строки, т.е.

= 1000000 * (дд (сегодня () - 1,0,0,0) - 01 января 1970 г .: 00:00)

вместо метки времени unix в usecs.

с использованием unix_starttime = 1000000 * (& starttime - '01JAN1970: 00: 00'dt); вне макроса в шаге данных работает

мне нужен нулевой шаг данных в макросе, чтобы он работал как положено?

Спасибо

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

В целом, если вы хотите работать с данными, лучше использовать код SAS, а не код MACRO. Вы можете использовать CALL SYMPUTX () для генерации макропеременной, если она понадобится вам позже.

data _null_;
  call symputx('unix_starttime',1000000*(&starttime - '01JAN1970:00:00'dt));
  ...
run;

Вы можете использовать% eval () для выполнения простой целочисленной арифметики и сравнений. Если вам нужно использовать числа с плавающей запятой (или литералы даты / времени / даты и времени), тогда вам нужно использовать% sysevalf ().

 %let unix_starttime=%sysevalf(1000000*(&starttime - '01JAN1970:00:00'dt));
1 голос
/ 25 апреля 2019

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

Это %eval, используемые для целочисленных вычислений, или %sysevalf, где требуются вычисления с использованием десятичных дробей.

чтобы вы могли поставить %let unix_starttime = %eval(1000000*(&starttime - '01JAN1970:00:00'dt));

Это не применимо здесь, но если вам когда-либо понадобится включить функцию в оператор %let, то перед именем функции следует указать %sysfunc

...