我想以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
请帮忙。
答案 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)
编辑:将输入更改为PUT
Year = substr(put(year(today()), 4.), 3);