我认为这里值得更详细地探讨这些问题。
首先,格式是将数值转换为人类可读格式的模式。这就是您要在此处执行的操作:将日期值转换为人类可读的格式,在本例中为一年。
另一方面,信息将人类可读的信息转换为数值。那不是你在这里做的;你已经有了价值。
其次,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 函数得到它,如果你愿意,或者 put/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 好一点,因为它保证在今天。如果您是批量运行此程序或每天重新启动会话,这无关紧要,但如果您有一个长时间运行的会话,它会很重要。