#sas
Вопрос:
Я пытаюсь преобразовать простую дату в дату9. форматирование.
%let snapshot_date=201806;
%let dt0=%sysfunc(intnx(month,%sysfunc(inputn(amp;snapshot_date.,yymmn6.)),0,b),yymmn6.);
data new;
set sample;
format cutoff_date date9.;
cutoff_date=input(amp;dt0.,anydtdte11.);
run;
Я получаю cutof_date как 28 июня 2020 года вместо 30 июня 2018 года. iam делает здесь что-то не так.
Комментарии:
1. Почему у вас есть шаг DT0? Он возвращает точно такое же значение в том же формате.
Ответ №1:
Таким образом, операторы макроса начинаются со строки YYYMM. Преобразуйте его в первый день месяца с помощью функции INPUTN(). Затем преобразуйте его с этой даты обратно в ту же дату, используя функцию INTNX () с интервалом, равным нулю. (Возможно, в вашей реальной проблеме интервал не равен нулю?). Затем преобразуйте его обратно в новую строку ГГГГ.
Генерируемый вами код SAS :
cutoff_date=input(201806,anydtdte11.);
Это попытка преобразовать число 201,806 в дату, используя ANYDTDTE11. informat. Поскольку функции INPUT() в качестве входных данных требуется строка, а не число, SAS преобразует число 201,806 в строку, используя BEST12. format. Поэтому он запускает этот код:
cutoff_date=input(" 201806",anydtdte11.);
Информация ANYDTDTE должна решить сопоставить эти 6 символов с месяцем, днем и годом, чтобы она разделилась на три части 20 18 06
. Поскольку первые два больше 12, один должен быть днем, а другой годом. Он решает, что это порядок Y / D / M. Не уверен, почему, поскольку я никогда не видел, чтобы этот порядок использовался в реальной жизни.
Вместо этого используйте ту же информацию в коде SAS, которая использовалась в коде макроса. Итак, чтобы преобразовать строку 201806 в коде SAS, вы должны использовать любой из этих операторов:
cutoff_date=input("201806",yymmn6.);
cutoff_date=inputn("201806","yymmn6.");
Чтобы сгенерировать это из вашей макропеременной, вам нужно добавить кавычки. Поэтому используйте:
cutoff_date=input("amp;dt0.",yymmn6.);
Ответ №2:
SAS интерпретирует даты как количество дней с 1 января 1960 года, и вы предоставляете число input
функции, которая предназначена для преобразования символов в числа. anydtdte.
в результате неправильно интерпретирует его. Заключите в кавычки amp;dt0
и используйте yymmn6.
вместо этого informat, чтобы SAS правильно преобразовал его в дату.
data new;
format cutoff_date date9.;
cutoff_date=input("amp;dt0.",yymmn6.);
run;
Вывод:
cutoff_date
01JUN2018
anydtdte.
здесь не будет работать, поскольку yymmn6.
его нет в списке форматов, которые он пытается прочитать. Список типов дат, которые он будет считывать, находится здесь: