以下对我来说很好,因为我想选择列的YYYYQ值来显示年份和季度:
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 :(得分: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.数据步骤会在日志中返回正确的答案。不确定这是一个错误还是我做的事情有点不对。