SAS:以YY格式获得当年

时间:2016-11-01 17:28:54

标签: date sas format

我想以YY格式将当前年份分配给宏或数据集变量。

我可以使用自动宏变量&sysdate&sysdate9来获取当前日期。然而,以YY格式提取年份被证明是一场噩梦。以下是我一直在尝试的一些例子。

存在YEARw.格式。但是当我尝试使用它时,我会得到错误或奇怪的结果。例如,运行

data _null_;
  yy = year(input("&sysdate9.", year2.));
  put  yy=;
run;

产生错误

ERROR 48-59: The informat YEAR was not found or could not be loaded.

如果我尝试在输出中格式化变量,我会得到1965而不是当前年份。以下

data _null_;
  yy = year(input("&sysdate9.", date9.));
  put  yy= yy year2.;
run;

输出

yy=2016 65

请帮忙。

3 个答案:

答案 0 :(得分:4)

这可以帮助您获得当年的2位数年份:

DATA _NULL_;

YEAR = PUT(TODAY(),YEAR2.);
PUT YEAR;

RUN;
/* Returns: 16 */

要分解我在这里做的事情:

我使用TODAY()将当前日期作为DATE类型。 &SASDATE需要转换为DATE,但也是SAS会话开始的日期。 TODAY()是当前日期。

PUT允许我们传入非字符(数字/日期)值,这就是TODAY()INPUT相对应的原因。

答案 1 :(得分:3)

我认为值得更详细地探讨这里的问题。

首先,格式是用于将数值转换为人类可读格式的模式。这就是你想要做的事情:将日期值转换为人类可读格式,在本例中为一年。

另一方面,Informats将人类可读信息转换为数值。那不是你在这里所做的;你已经有了价值。

其次,put与格式匹配,input仅与信息匹配。

第三,你在上一次尝试中接近了:但你滥用了year格式。格式基本上是值映射,因此它们将其范围内的每个可能的数值(有时“所有值”是范围,有时不是)映射到显示值(字符串)。您需要知道输入的预期值。 YEARw.期望日期值为输入,而不是年份值:意味着输入是“从1960年1月1日起的天数”,映射到“年”。因此,您无法获取已经映射到年份值的值,并使用该方法再次映射它;它没有任何意义。

让我们来看看:

data _null_;
  yy = year(input("&sysdate9.", date9.));
  put  yy= yy year2.;
run;

yy包含year函数的结果 - 2016年。到目前为止很好。现在,您需要2位数年份(16);你可以通过mod函数得到它,如果你愿意,或者把/ substr / input:

data _null_;
  yy = input(substr(put(year(input("&sysdate9.", date9.)),4.),3,2),2.);
  put yy=;
run;

mod可能更容易,因为它是一个数字。但当然你可以使用year

data _null_;
  yy = put(input("&sysdate9.", date9.),year2.);
  put yy=;
run;

现在,yy是字符,因此您可以使用input(...,2.)将其换行,或根据您的目的保留字符。

最后 - 关于&sysdate9.的使用说明。您可以轻松地将其设为日期而无需输入:

"&sysdate9."d

所以:

yy = put("&sysdate9."d,year2.);

这称为日期文字("..."dt"..."t也适用于日期时间,时间)。它们需要标准SAS格式的东西才能正常工作。

正如Nicarus的回答所指出的那样,today()&sysdate9好一点,因为它保证今天。如果您是批量运行或每天重新启动会话,这无关紧要,但如果您有一个长时间运行的会话,它将会出现。

答案 2 :(得分:0)

  • 将年份函数应用于日期变量
  • 转换为字符串
  • 取最后2位

编辑:将输入更改为PUT

    Year = substr(put(year(today()), 4.), 3);