1

以下对我来说很好,因为我想为一列选择 YYYYQ 值来显示年份和季度:

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

如何计算“半年”而不是 QTR?我可以在 SAS 文档中找到对它的引用,但似乎无法让它工作。我想显示 YYYYS,因为它是年份和年份“一半”。

谢谢。

4

1 回答 1

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。数据步骤在日志中返回正确的答案。不知道这是一个错误还是我做错了什么。

于 2013-05-06T13:57:52.550 回答