2013-05-04 111 views
1

下正常工作對我來說,因爲我要選擇某列的YYYYQ值,顯示其年份和季度:SAS日期 - SEMIYEAR在PROC SQL

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

我如何計算「SEMIYEAR」而不是QTR?我可以在SAS文檔中找到它的參考,但似乎無法使其發揮作用。我想展示YYYYS,因爲它是年份和年份的一半。

謝謝。

+0

請編輯您的問題,併爲「betdate」添加一個值的示例以及您希望顯示的方式。 – BellevueBob 2013-05-04 17:47:05

回答

1

不幸的是,沒有確切的格式或功能。您是否需要將值的日期部分保留,或者只需要值「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.數據步驟返回日誌中的正確答案。不知道這是否是一個錯誤,或者如果我做的事情有點錯誤。

+0

感謝您的回覆。爲什麼我需要'樓層(QTR(datepart(betdate))/ 2)+1'中的'+1'? – user2146441 2013-05-07 14:48:29

+0

我調整它給你1或2不是0或1,雖然我認爲現在看起來實際上有點偏離 - +1需要在分區內[so,floor((qtr(datepart (betdate))+ 1)/ 2)]。你需要1和2作爲結果,floor(1/2)= 0。所以調整1,2,3,4爲2,3,4,5,你有2,3/2 = 1和4,5/2 = 2. – Joe 2013-05-07 15:02:43

+0

太好了!我在那裏得到了三個'半'年!很棒。根據你的第一個建議:我計劃得到年份和半年,並使用'cats()'連接它們。不幸的是,當我運行'proc rank'時,它拒絕工作,因爲20111年或20112年是一個char值。有沒有一種快速的方法將它變成一個數字,以便'proc rank'可以處理它? – user2146441 2013-05-07 15:09:07