SAS преобразования даты - PullRequest
0 голосов
/ 05 мая 2018

У меня есть ниже макро переменная с yymmn6. формат.

%let a=201501;

Я хочу иметь новую макропеременную b на основе макроса a с '2015-01-01' (формат teradata). Так что я могу вызвать макрос б в где условие

Я попробовал приведенные ниже коды.

%let b=%sysfunc(put(&a.,year4.)||'-'||put(&a,month2.)||'-01'||"'");
%put &b.

Результат: ВАРИАНТЫ NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK; ОШИБКА: Ожидается закрывающая круглая скобка после вызова макрофункции. 61
62
63% let b =% sysfunc (put (& a., Year4.) || '-' || put (& a, month2.) || '-01' || "'"); 64% положено и б. 65

   %let b=%sysfunc(putn(&a.,yymmn6.),yymmdd10.);

Результат:

% let b =% sysfunc (putn (& a., Yymmn6.), Yymmdd10.); 64% положено и б. 65
66 ВАРИАНТЫ NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK; 251203 ВАРИАНТЫ НЕ УКАЗАНЫ NOSTIMER NOSOURCE NOSYNTAXCHECK

%let a=201501;
data _null_;
date=input("&a.",yymmn6.);
call symput('date1' , "'"||put(date,year4.)||'- 
'||put(date,month02.)||'-01'||"'");
run;
%put &date1.;

для вышеуказанных данных ноль результат, который я получаю

68% положено & дата1 .; '2015-1-01'

Итак, все, что я пытаюсь сделать, это конвертировать 201501 в 2015-01-01 и искать решение, используя макрос% let, не входящий в symppt

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Вы можете преобразовать ваше представление месяца ггггмм в гггг-мм-01 , используя

  • %sysfunc чтобы не требовать шага данных и вызывать функции inputn и putn
  • inputn для преобразования представления месяца в значение даты sas
  • putn для преобразования значения даты sas в гггг-мм-дд представление
* * Пример тысяча двадцать-одина * * тысяча двадцать-дв
%let month = 201501;
%let fom_date = %sysfunc(inputn(&month,yymmn6.));
%let fom_ymd = %sysfunc(putn(&fom_date,yymmdd10.));

%put &=month;
%put &=fom_date;
%put &=fom_ymd;

Как макрос, который заключает в кавычки выдаваемое представление, чтобы быть литералом даты Teradata.

%macro ymn_to_tddl (month);
%* emit teradata date literal corresponding to month;
%* month - month representation as yyyymm;
%str(%')%sysfunc(putn(
    %sysfunc(inputn(&month,yymmn6.))
   ,yymmdd10.
   ))%str(%')
%mend;

%put %ymn_to_tddl (201501);

---- журнал ----

'2015-01-01'
0 голосов
/ 05 мая 2018

Вы ошиблись в нескольких вещах. Важным является то, что 201501 не является датой SAS. SAS хранит даты как количество дней с 1 января 1960 года. Для вас 201501 представляет 1 января 2015 года. Для SAS 201501 представляет 10 сентября 2511.

На языке макросов вы можете вызвать функцию INPUTN для преобразования 201501 в дату SAS для 1 января 2015 года, а затем вызвать функцию PUTN, чтобы преобразовать ее в желаемый формат YYYY-MM-DD.

%let a=201501 ;
%let a_SASdate=%sysfunc(inputn(&a,yymmn6.)) ;
%let b=%sysfunc(putn(&a_SASdate,yymmdd10.)) ;
%put &=a &=a_SASdate &=b ;

A=201501 A_SASDATE=20089 B=2015-01-01

Вы можете сделать все это в одном утверждении, если вы не возражаете против множества скобок:

%let b=%sysfunc(putn(%sysfunc(inputn(&a,yymmn6.))
                    ,yymmdd10.
                )) ;
...