Для этого, к сожалению, нет определенного формата или функции. Вам нужна дата-часть значения, которое нужно сохранить, или просто значение «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. Шаг данных возвращает правильный ответ в журнале. Не уверен, что это ошибка, или если я делаю что-то очень слабое.
Измените свой вопрос и добавьте пример одного значения для 'betdate' и как вы хотите его отобразить. – BellevueBob