Как автоматически построить формат даты и времени с нулями в последний рабочий день - PullRequest
0 голосов
/ 20 сентября 2019

Я пытаюсь создать макрос для возврата последнего рабочего дня в полночь в sas для фильтрации в базах данных Oracle.

Я уже нахожу часть рабочего дня, но у меня проблемы с преобразованием в datetime.

Я пытался объединить sysfunc / qsysfunc / eval с некоторыми функциями даты и времени sas, но никто не вернулся

%macro weekdays;
 %let data_proc = %SYSFUNC(TODAY());

 %if %sysfunc(weekday(&data_proc.)) eq 2 %then
      %do;
            %let data_return= %sysfunc(intnx(DAY,&data_proc.,-3));
      %end;

 %else %if %sysfunc(weekday(&data_proc.)) eq 1 %then
      %do;
            %let data_return= %sysfunc(intnx(DAY,&data_proc.,-2));
      %end;
 %else
      %do;
            %let data_return = %sysfunc(intnx(DAY,&data_proc.,-1));
      %end;

 %PUT >>>>> &data_return.;
%mend;

%weekdays;

Макрос рабочих дней возвращается >>>>> 21811

И мне нужно, чтобы окончательное возвращение было в формате '12SEP2019: 00: 00: 00'dt

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Макрос ничего не возвращает.Макросы не возвращают значения, они выполняют обработку и могут генерировать или не генерировать дополнительный исходный код (кодовый код), который вводится в поток отправки для исполнителя.

Если вам нужно, чтобы значение '12SEP2019:00:00:00'dt было сгенерировановаш макрос, вам нужно будет использовать %str при создании отправляемого кодгена.

%macro weekdays;
  %local today datecomp;

  %let today = %SYSFUNC(TODAY());

  %if %sysfunc(weekday(&today.)) eq 2 %then
    %let datecomp = %sysfunc(intnx(DAY,&today.,-3));
  %if %sysfunc(weekday(&today.)) eq 1 %then
    %let datecomp = %sysfunc(intnx(DAY,&today.,-2));
  %else
    %let datecomp = %sysfunc(intnx(DAY,&today.,-1));

  /* emit datetime literal from datecomp, nominally considered a return by functional language programmers */
  %str(%')%sysfunc(putn(&datecomp,date9.)):00:00:00%str(%'DT)
%mend;

%put %weekdays;
%let somedatetimeliteral=%weekdays;
%put &=somedatetimeliteral;

Вы также можете использовать PROC FCMP для создания пользовательской функции, которая действительно возвращает значение.

0 голосов
/ 20 сентября 2019

Число 21 811 является значением для даты '19SEP2019'd.Поэтому просто примените формат DATE9 для его преобразования.

%let date_return="%sysfunc(putn(&date_return,date9)):00:00:00"dt;

Обратите внимание, что вы также можете использовать необязательный второй аргумент для функции% SYSFUNC (), чтобы сообщить ему, как форматировать результаты функции.

%let data_return = %sysfunc(intnx(DAY,&data_proc.,-1),date9);

Тогда вам просто нужно добавить суффикс :00:00:00, чтобы он выглядел как значение даты / времени вместо значения даты.

Обратите внимание, что вы, вероятно, можете устранить большую часть этой логики и просто позволить INTNX () найдите подходящий день, используя интервал WEEKDAY вместо интервала DAY.

%put "%sysfunc(intnx(weekday,%sysfunc(today())-1,0),date9):00:00:00"dt;
...