Я думаю, что здесь стоит рассмотреть вопросы более подробно.
Во-первых, форматы представляют собой шаблоны для преобразования числовых значений в читаемый человеком формат. Вот что вы хотите сделать здесь: преобразуйте значение даты в удобочитаемый для человека формат, в этом случае - год.
С другой стороны, информация, преобразующая информацию, читаемую человеком, в числовые значения. Это не то, что вы здесь делаете; у вас уже есть значение.
Во-вторых, put
совпадения с форматами и input
соответствует только информационным материалам.
В-третьих, вы подходите в последнюю минуту: но вы неправильно используете формат year
.Форматы - это в основном сопоставления значений, поэтому они отображают каждое возможное числовое значение в их диапазоне (иногда «все значения» - это диапазон, иногда нет) до значения отображения (строки). Вам нужно знать, какая величина ожидается на входе. YEARw.
ожидает значение даты в качестве входного, а не годового значения: значение ввода - «количество дней с 1/1/1960», отображаемое на «год». Таким образом, вы не можете использовать значение, которое вы уже сопоставили с значением года, и снова сопоставить его с этим методом; это не имеет никакого смысла.
Давайте посмотрим на него:
data _null_;
yy = year(input("&sysdate9.", date9.));
put yy= yy year2.;
run;
yy
содержит результат year
функции - 2016. хорошо до сих пор. Теперь вам нужен 2-значный год (16); вы можете получить, что через mod
функцию, если вы хотите, или положить/SubStr/вход:
data _null_;
yy = input(substr(put(year(input("&sysdate9.", date9.)),4.),3,2),2.);
put yy=;
run;
mod
, вероятно, легче, хотя, так как это число. Но, конечно, вы могли бы использоваться year
:
data _null_;
yy = put(input("&sysdate9.", date9.),year2.);
put yy=;
run;
Теперь yy
это характер, так что вы можете обернуть, что с input(...,2.)
или оставить его характер в зависимости от ваших целей.
И наконец - примечание по использованию на &sysdate9.
. Вы можете легко сделать это без даты ввода:
"&sysdate9."d
Итак:
yy = put("&sysdate9."d,year2.);
Это называется дата буквальный (и "..."dt
и "..."t
также работать DateTime, время). Они требуют, чтобы вещи в стандартных форматах SAS работали правильно.
И как указано в ответе Никара, today()
немного лучше, чем &sysdate9
, так как это гарантировано сегодня. Если вы запускаете это в пакетном режиме или перезапускаете сеанс каждый день, это не имеет значения, но это будет, если у вас длительный сеанс.
'PUT' - одно из отличий. Кроме того, попробуйте заменить' TODAY() 'на' SYSDATE' - вы увидите, что есть еще одно различие .... – Nicarus
Спасибо за объяснение! – Joe