2016-11-01 4 views
2

Я хочу присвоить текущий год в формате YY либо переменной макроса, либо набору данных.SAS: Получить текущий год в формате YY

Я могу использовать автоматические макропеременные &sysdate или &sysdate9, чтобы получить текущую дату. Однако извлечение года в формате YY оказывается кошмаром. Ниже приведены некоторые примеры того, что я пытался.

Существует формат YEARw.. Но когда я пытаюсь использовать его, я получаю ошибки или странные результаты. Например, бег

data _null_; 
    yy = year(input("&sysdate9.", year2.)); 
    put yy=; 
run; 

производит ошибку

ERROR 48-59: The informat YEAR was not found or could not be loaded. 

Если я пытаюсь форматировать переменную на выходе, я получаю 1965 вместо текущего года. Следующие

data _null_; 
    yy = year(input("&sysdate9.", date9.)); 
    put yy= yy year2.; 
run; 

выходы

yy=2016 65 

Пожалуйста, помогите.

ответ

4

Это работает, чтобы получить вы 2-значный номер года в текущем году:

DATA _NULL_; 

YEAR = PUT(TODAY(),YEAR2.); 
PUT YEAR; 

RUN; 
/* Returns: 16 */ 

к пробою, что я делаю здесь:

Я использую TODAY(), чтобы получить текущую дату в качестве DATE типа. &SASDATE необходимо преобразовать в DATE, но также это дата начала сеанса SAS. TODAY() - текущая дата.

PUT позволяет нам передавать несимвольное (числовое/дата) значение, поэтому оно используется с TODAY(), а не INPUT.

+0

'PUT' - одно из отличий. Кроме того, попробуйте заменить' TODAY() 'на' SYSDATE' - вы увидите, что есть еще одно различие .... – Nicarus

+0

Спасибо за объяснение! – Joe

0
  • Применить функцию года до даты переменной
  • Преобразование в строку
  • Возьмите последние 2 цифры

EDIT: вход изменение PUT

Year = substr(put(year(today()), 4.), 3); 
+0

Это не работает для меня. Когда я запускаю 'data _null_; Year = substr (input (year (today()), 4.), 3); положить год =; run; ', я получаю сообщение о преобразовании числа в символ, а затем в Год =. выводится. –

+1

Я думаю, что 'substr (input (' всегда неверно. 'Substr' является текстовой/символьной функцией и никогда не должен применяться непосредственно к числовому, который в большинстве случаев генерируется' input'. Remove 'in', и это должно работать как Ожидается, что – Joe

2

Я думаю, что здесь стоит рассмотреть вопросы более подробно.

Во-первых, форматы представляют собой шаблоны для преобразования числовых значений в читаемый человеком формат. Вот что вы хотите сделать здесь: преобразуйте значение даты в удобочитаемый для человека формат, в этом случае - год.

С другой стороны, информация, преобразующая информацию, читаемую человеком, в числовые значения. Это не то, что вы здесь делаете; у вас уже есть значение.

Во-вторых, 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, так как это гарантировано сегодня. Если вы запускаете это в пакетном режиме или перезапускаете сеанс каждый день, это не имеет значения, но это будет, если у вас длительный сеанс.

Смежные вопросы