Неверный вывод даты

#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. его нет в списке форматов, которые он пытается прочитать. Список типов дат, которые он будет считывать, находится здесь:

https://go.documentation.sas.com/doc/en/pgmsascdc/9.4_3.5/leforinforref/n04jh1fkv5c8zan14fhqcby7jsu4.htm?homeOnFail