【问题标题】:Conversion of SAS Macro Variable to time stampSAS 宏变量到时间戳的转换
【发布时间】:2013-09-08 01:12:29
【问题描述】:

我正在尝试将 SAS 宏变量转换为时间戳并在转换时遇到问题。我正在使用的代码如下。

%let date = '03/15/2013';
%put %sysfunc(inputn(&date,datetime26.6));

我得到的错误是

警告:由 %SYSFUNC 引用的函数 INPUTN 的参数 1 或 %QSYSFUNC 宏函数超出范围。注意:数学 在 %SYSFUNC 函数执行期间无法执行操作。 操作结果已设置 到一个缺失值。

如果有人知道这个问题的答案,请告诉我。

【问题讨论】:

    标签: date macros timestamp sas


    【解决方案1】:

    那不是 DATETIME,那是 DATE 格式(对于 INPUT,这取决于传入的数据,而不是传出的数据)。您还需要删除引号,SYSFUNC 将引号视为字符,而不是字符串分隔符。

    %let date = 03/15/2013;
    %put %sysfunc(inputn(&date,MMDDYY10.));
    

    要实际创建日期时间,您需要使用 PUT:

    %let date = 03/15/2013;
    %put %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0)),datetime26.));
    

    但是,如果可以的话,更好的方法是使用日期常量...

    %let date=15MAR2013;
    %put "&date."d;
    

    【讨论】:

      【解决方案2】:

      乔基本上是正确的。如果您想要 2013 年 3 月 15 日午夜的日期时间字符串,请使用

      %let date = 03/15/2013;
      %put %sysfunc(putn(%sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0)),datetime26.));
      

      只需在日期字符串上使用 PUTN 将日期“转换”为日期时间,就会将纪元 (01JAN1960) 的天数转换为纪元的秒数​​。

      【讨论】:

      • 感谢 DomPazz。 “DHMS”的把戏对我来说是新的,显然你们俩都非常正确。不幸的是,我从执行此操作的数据库中获取日期。
      • 哎呀,这就是我在无聊的 IT 电话会议中回答而不是测试得到的结果。谢谢你的收获。
      • @DomPazz Hi Dom - %sysfunc 支持 2 个参数,其中第二个参数将格式应用于结果。这意味着您不再需要调用putn()putc() 来格式化结果。我认为它是在 9.x 版中添加的......例如%put %sysfunc(dhms(%sysfunc(inputn(&date,MMDDYY10.)),0,0,0),datetime26.);
      • @RobPenridge 很高兴知道!我想我已经看到了它的用法,但在某些事情上我还是有点老派。
      【解决方案3】:

      我对在宏变量中使用日期的偏好是将实际数值存储在宏变量中,如果我需要查看/打印格式化的值,然后动态为其分配格式:

      %let date = %sysfunc(mdy(3,15,2013));
      %put %sysfunc(putn(&date,date9.));
      

      这允许您在以下比较中使用它(我发现这是最常见的任务):

      data xx;
        set something;
        where datefield = &date;
      run;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2013-06-16
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多