2013-05-04 3 views
1

Следующие отлично работает для меня, как я хочу, чтобы выбрать значение YYYYQ для столбца, чтобы показать год и квартал:SAS Даты - полугода в Proc SQL

proc sql; 
    select YYQ(year(datepart(betdate)) 
     , QTR(datepart(betdate))) FORMAT=YYQN. as yearquarter 
     , QTR(datepart(betdate)) as semiyear 
    from &dsn; 
quit; 

Как я могу вычислить «полугода» вместо QTR? Я могу найти ссылки на него в документации SAS, но, похоже, не может заставить его работать. Я хочу показать YYYYS, как это год и полтора года.

Спасибо.

+0

Измените свой вопрос и добавьте пример одного значения для 'betdate' и как вы хотите его отобразить. – BellevueBob

ответ

1

Для этого, к сожалению, нет определенного формата или функции. Вам нужна дата-часть значения, которое нужно сохранить, или просто значение «20131»? (Например, в вашем YYQ базовое значение является фактической датой, которая соответствует первой дате в период 2013Q1, поэтому 1 января, она отображается только как 20131).

Если вы просто хотите, чтобы отобразить значение, вы можете сделать что-то очень простое, как это:

proc sql; 
    select YYQ(year(datepart(betdate)) 
     , QTR(datepart(betdate))) FORMAT=YYQN. as yearquarter 
     , floor(QTR(datepart(betdate))/2)+1 as semiyear 
    from test; 
quit; 

И добавьте на год, если вы хотите. Однако это не поддерживает фактическое значение первого дня недели. Если вы хотите сделать что, вы должны использовать INTNX:

proc sql; 
    select YYQ(year(datepart(betdate)) 
     , QTR(datepart(betdate))) FORMAT=YYQN. as yearquarter 
     , intnx('SEMIYEAR',datepart(betdate),0,'b') FORMAT=DATE9. as semiyear 
    from test; 
quit; 

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

proc format; 
value SEMIYEAR 
'01JAN2013'd-'30JUN2013'd = '20131' 
'01JUL2013'd-'31DEC2013'd = '20132' 
; 
quit; 

К сожалению, вы не можете использовать форматы изображения, чтобы сделать это, насколько я знаю, - документацию, по крайней мере, не дает возможность отображать полугодовой период. Вы можете либо сделать, как я сделал выше, и просто указать периоды времени в диапазоне, или вы можете написать формат функции; см. http://support.sas.com/documentation/cdl/en/proc/65145/HTML/default/viewer.htm#n1eyyzaux0ze5ln1k03gl338avbj.htm для примеров того, как это сделать.

Редактировать: Вот пример, который в основном работает.

proc fcmp outlib=work.functions.smd; 
    function sfmt(date) $; 
     length snum $5; 
     snum = put(year(date)*10+floor(QTR(date)/2)+1,5.); 
     return(snum); 
    endsub; 
run; 

options cmplib=(work.functions); 
proc format; 
value semiyear 
other=[sfmt()]; 
quit; 

data test2; 
set test; 
x=put(datepart(betdate),semiyear.); 
put x=; 
run; 
proc sql; 
    select YYQ(year(datepart(betdate)) 
     , QTR(datepart(betdate))) FORMAT=YYQN. as yearquarter 
     , intnx('SEMIYEAR',datepart(betdate),0,'b') FORMAT=SEMIYEAR5. as semiyear 
    from test; 
quit; 

Однако, по какой-то причине в моей сессии по крайней мере, PROC SQL возвращает кретиничные символы вместо 20131. Шаг данных возвращает правильный ответ в журнале. Не уверен, что это ошибка, или если я делаю что-то очень слабое.

+0

Спасибо за ответ. Зачем мне «+1» в полу (QTR (datepart (betdate))/2) +1 '? – user2146441

+0

Я корректирую его, чтобы дать вам 1 или 2, а не 0 или 1, хотя я думаю, что на самом деле немного от него, когда я смотрю на него сейчас - +1 должен находиться внутри раздела [so, floor ((qtr (datepart (betdate)) + 1)/2)]. Вы хотите получить 1 и 2 в качестве результатов, а пол (1/2) = 0. Так что отрегулируйте 1,2,3,4 до 2,3,4,5, и у вас 2,3/2 = 1 и 4,5/2 = 2. – Joe

+0

Отлично! Я получал там три полутора лет! Прекрасно работает. Согласно вашему первому предложению: я планировал получить год и полгода и объединить их с помощью «кошек()». к сожалению, когда я запустил «proc rank», он отказался работать, поскольку 20111 или 20112 был значением char. Есть ли быстрый способ изменить это число, чтобы на нем работало «proc rank»? – user2146441