全局SAS变量定义中的日期到字符串转换



我的目标是在全局SAS变量中连接一个长目录字符串,而不使用额外的数据步骤。我有以下代码:

%let deadline='31Dec2019'd;
%let rootDir=Y:PD;
%let timestamp=input(&deadline.,yymmdd8.);
%let PATH=&rootDircurrentStats&timestamp.;
%put &PATH.--;

这给了我一个让我困惑的错误:

检测到开放代码语句递归。

我也尝试了%input%putput而不是input,但总是出现相同的错误。我对SAS仍然不太流利,所以请原谅我这个愚蠢的问题,但我在网上找不到任何有效的解决方案,而且这里似乎也没有人问过。

没有解决我的问题的资源:

  • https://communities.sas.com/t5/SAS-Programming/Convert-Date-to-Character/td-p/349562

  • https://communities.sas.com/t5/SAS-Procedures/Converting-date-to-Character/td-p/90392

  • SAS(字符串到日期(中的日期转换

  • 将日期文本源代码段评估为日期值
  • 使用格式B8601DA8.将日期值呈现为yyyymmdd

SAS宏可以通过%sysfunc宏函数使用Base函数。

语法为

%let result = %sysfunc ( <function-name> ( <arg-1>, ... ) );

在宏中,字符串文本被传递给函数,而不使用将其用单引号括起来。为什么?因为宏的核心是一个只处理字符串的系统,可能会产生代码编写的副作用。

您的更改

宏变量实际上包含日期文本的源代码。您需要将其评估为日期值,然后将结果格式化为所需的文件名部分构造(yy-mm-dd-(

%let deadline='31Dec2019'd;
%let ymd_str=%sysfunc(putn(&deadline,yymmdd6.));
%put &=deadline;
%put &=ymd_str;
---------- Log ----------
DEADLINE='31Dec2019'd
YMD_STR=191231

有不同的日期表示可能是文件名的实际部分。以下是一些可能性:

/*  date representation construct according to ----> format */
%put yymmdd   : %sysfunc(putn(&deadline,  yymmdd6.));
%put yy-mm-dd : %sysfunc(putn(&deadline,  yymmdd8.));
%put yyyymmdd : %sysfunc(putn(&deadline,  B8601DA8.));
%put yyyymmdd : %sysfunc(putn(&deadline,  YYMMDDN8.));
----- log -----
yymmdd   : 191231
yy-mm-dd : 19-12-31
yyyymmdd : 20191231
yyyymmdd : 20191231

最新更新