ДД МЕС ГГГГ по ГГММn6

Я пишу программу в Proc SQL. программа принимает различные входные файлы, имена которых меняются от месяца к месяцу (например, myfile_YYYY_MM или mytable_YYYYMM или mydata_YY_M).

Большая часть программы теперь является динамической, и пользователю предлагается ввести отчетную дату через подсказку при выполнении программы.

«Дата подсказки» (&Rep_Date.) в коде имеет формат DD MON YYYY (31 мая 2018 г.), и мне нужно настроить одну макропеременную, преобразующую это значение в формат YYMMn6 (т.е. 201805).

Синтаксис выглядит следующим образом:

 %let Period = input("&Rep_Date."d,YYMMN.); 

Это работало при попытке создать переменную d9 и для создания переменной месяца/года, например:

 %let date = "&Rep_Date."d; /*Last day execution month*/
 %let year = %sysfunc(year("&Rep_Date."d));
 %let month = %sysfunc(month("&rep_Date."d));

почему-то тоже самое не получается при попытке отформатировать дату в ГГММn6.

Я также попытался создать переменную «Период» во временной таблице SAS, как это, но снова не повезло:

 Data dates; 
 Period = input((&Rep_date.,6.), yymmn6.);
 format Period yymmn6.;
 Run;

Любые идеи о том, где я ошибаюсь?


person Joakim M. Viland    schedule 18.06.2018    source источник
comment
Почему у этого есть тег SQL?   -  person Richard    schedule 18.06.2018


Ответы (2)


Я считаю, что проблема связана с тем, что вы используете только функцию input в своем выражении %let. Это не разрешится должным образом. Правильным было бы использовать макрофункцию %sysfunc с функцией input. Проблема в том, что sysfunc не работает с функцией ввода. Следовательно, решение состоит в том, чтобы использовать %sysfunc(putn()). Вот пример.

Изменить: не уверен, чего вы пытаетесь достичь, но функция %window (при условии, что вы используете Windows) позволяет вам вводить данные через приглашение, а затем создавать макропеременную из ввода. Вот пример:

%global Period;

%window info
  #5 @5 'Please enter date:'
  #5 @40 _Date 9 attr=underline;
%display info;
%put &_Date.;


%macro da(Rep_Date=&_Date);
%let Period = %sysfunc(putn("&Rep_Date."d,YYMMN.)); 
%put &Period.;
%mend;

%da();

Это должно работать.

person John Doe    schedule 18.06.2018
comment
Привет JD, Это работает, но я пытаюсь сделать ввод для переменной Period вводом из окна подсказки даты. Есть ли способ сделать %da(Rep_Date = &Rep_Date.)? пробовал кавычки и т.д. не хотел работать! - person Joakim M. Viland; 18.06.2018
comment
Я обновил ответ. Дайте мне знать, если это решит вашу проблему. - person John Doe; 18.06.2018

Что происходит не так? Вы смешиваете контексты и неверно истолковываете представление как буквальное (буквально — каламбур, буквально задуманный).

Короче

Пусть ваш код макроса использует значение представления даты в качестве основы для буквального значения, которое используется в putN(), вызываемом %sysfunc.

%let Rep_Date = 18-JUN-2018; * some date representation;
%let Period = %sysfunc(PUTN("&Rep_Date."D,YYMMN.));
%put NOTE: Period=%superq(Period);

Длинно

Из глоссария в «Справке и документации SAS» (F1)

  • Значение даты SAS
    целое число, представляющее дату в программном обеспечении SAS. Целое число представляет количество дней между 1 января 1960 года и другой указанной датой. Например, значение даты SAS 366 представляет календарную дату 1 января 1961 года.

  • Константа даты SAS
    строка в форме 'ddMMMyyy'd или 'ddMMMyyyy'd, представляющая дату в инструкции SAS. Строка заключена в кавычки, за ней следует символ d (например, '6JUL01'd, '06JUL01'd, '6 JUL2001'd или '06JUL2001'd).

  • формат даты и времени
    инструкции, которые сообщают SAS, как записывать числовые значения в виде даты, времени и даты и времени.

  • информация о дате и времени
    инструкции, сообщающие SAS, как читать числовые значения, представленные в виде даты, времени и даты и времени.

Текстовые значения формы DD MON YYYY — это одна из форм представления даты. Форму с четырьмя цифрами года можно ввести с помощью инструкций, встроенных в информацию DATE11.. Литералы даты SAS (константа даты SAS) имеют форму DDMONYYYYD с различными пробелами, тире, косой чертой и т. д. или без них.

Другой вариант кода, похожий на «Коротко», будет вводить текст даты с использованием определенного формата (date11.) вместо того, чтобы полагаться на то, что система выполняет буквальную интерпретацию даты.

%let Rep_Date_text_representation = 18/JUN/2018;
%let Rep_Date_value = %sysfunc(inputN(&Rep_Date_text_representation,date11.));
%let Period = %sysfunc(putn(&Rep_Date_Value,yymmn.));

%put NOTE: &=Rep_Date_text_representation ;
%put NOTE: &=Rep_Date_value;
%put NOTE: &=Period;
person Richard    schedule 18.06.2018