不幸的是,沒有確切的格式或功能。您是否需要將值的日期部分保留,或者只需要值「20131」? (例如,在您的YYQ中,基礎值是實際日期,對應於2013Q1期間的第一個日期,因此1月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.數據步驟返回日誌中的正確答案。不知道這是否是一個錯誤,或者如果我做的事情有點錯誤。
來源
2013-05-06 13:57:52
Joe
請編輯您的問題,併爲「betdate」添加一個值的示例以及您希望顯示的方式。 – BellevueBob 2013-05-04 17:47:05