不幸的是,没有确切的格式或功能。您是否需要保留值的日期部分,还是只保留值“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。数据步骤在日志中返回正确的答案。不知道这是一个错误还是我做错了什么。