SAS日期 - Proc SQL中的SEMIYEAR

时间:2013-05-04 17:12:53

标签: sas

以下对我来说很好,因为我想选择列的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,因为它是年份和年份的一半。

感谢。

1 个答案:

答案 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.数据步骤会在日志中返回正确的答案。不确定这是一个错误还是我做的事情有点不对。