【问题标题】:SAS: Get current year in YY formatSAS:以 YY 格式获取当前年份
【发布时间】:2016-11-01 17:28:54
【问题描述】:

我想以 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

请帮忙。

【问题讨论】:

    标签: date sas format


    【解决方案1】:

    这可以让您获得当前年份的 2 位数年份编号:

    DATA _NULL_;
    
    YEAR = PUT(TODAY(),YEAR2.);
    PUT YEAR;
    
    RUN;
    /* Returns: 16 */
    

    分解我在这里做的事情:

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

    PUT 允许我们传入非字符(数字/日期)值,这就是为什么它与TODAY() 一起使用而不是INPUT

    【讨论】:

    • PUT 是一个区别,当然。另外,尝试用SYSDATE 替换TODAY() - 你会发现还有另一个区别......
    • 感谢您的解释!
    【解决方案2】:

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

    首先,格式是将数值转换为人类可读格式的模式。这就是您要在此处执行的操作:将日期值转换为人类可读的格式,在本例中为一年。

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

    其次,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 好一点,因为它保证在今天。如果您是批量运行此程序或每天重新启动会话,这无关紧要,但如果您有一个长时间运行的会话,它会很重要。

    【讨论】:

      【解决方案3】:
      • 将年份函数应用于日期变量
      • 转换为字符串
      • 取最后 2 位数字

      编辑:将输入更改为 PUT

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

      【讨论】:

      • 这对我不起作用。当我运行data _null_; Year = substr(input(year(today()), 4.), 3); put Year=; run; 时,我收到一条关于将数字转换为字符然后是 Year= 的注释。是输出。
      • 我认为substr(input( 总是错的。 substr 是一个文本/字符函数,不应直接应用于 input 在大多数情况下生成的数字。删除in,这应该可以按预期工作。
      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 2012-06-12
      • 2011-08-25
      • 2014-07-20
      相关资源
      最近更新 更多