【问题标题】:Using date macro variable in PROC SQL在 PROC SQL 中使用日期宏变量
【发布时间】:2016-04-06 17:04:41
【问题描述】:

我无法让宏变量在 PROC SQL 中正常工作,这对我来说没有意义。

首先,如果我生成这样的查询:

PROC SQL;
SELECT
   a.*
   ,'31MAR2016' As EVAL_DATE format=date09.
FROM
   myTable a
;

它按预期工作,并在表格末尾放置一个日期字段。

那么,如果我这样做:

%Let testDate = '31MAR2016'd;
%put &testDate;

PROC SQL;
SELECT
   a.*
   ,&testDate As EVAL_DATE format=date09.
FROM
   myTable a
;

这再次正常运行,日志窗口显示以下值:

'31MAR2016'd

但是,如果我这样做:

%Let Eval_Date = %sysfunc(intnx (month,%sysfunc(inputn(201603,yymmn6.)) ,0,E),date09.);
%Let Eval_date_test = %str(%')&Eval_Date.%str(%')d;
%Put Eval_date_test;

PROC SQL;
SELECT
   a.*
   ,&Eval_date_test As EVAL_DATE format=date09.
FROM
   myTable a
;

SAS 停止运行并出现错误;

"ERROR 22-322: 语法错误,期待以下之一:名称、带引号的字符串、数字常量、日期时间常量、 缺失值,(, *, +, -, BTRIM, CALCULATED, CASE, EXISTS, INPUT, NOT, PUT, SUBSTRING, TRANSLATE, USER, ^, ~.

错误 200-322:符号无法识别,将被忽略。"

日志显示 &Eval_date_test 的值与第二个示例中的“31MAR2016”相同。请注意,为了清楚起见,我分两步创建了变量,但如果您一步创建变量,也会发生同样的事情。

以防万一,我正在运行 SAS Enterprise Guide 6.1

为什么这不起作用?

【问题讨论】:

  • 为什么要使用宏引用的单引号?为什么不只使用普通的双引号? %let Eval_Date = "%sysfunc(intnx (month,%sysfunc(inputn(201603,yymmn6.)) ,0,E),date9)"d;
  • @Tom 因为我不知道单引号和双引号之间的区别。那么单引号用于宏,用于分隔字符串,而双引号在宏的上下文中仅被视为常规字符?
  • SAS 不在乎您使用哪个。但单引号内的文本不会针对宏触发器进行评估。所以'&eval_date' 不会解析宏变量引用,而"&eval_date" 会。
  • @Tom 这是很棒的信息!感谢您的帮助!

标签: sas


【解决方案1】:

这与使用%str() 宏取消引用宏的方式有关。试试%unquote() 宏:

PROC SQL;
SELECT
   a.*
   , %unquote(&Eval_date_test) As EVAL_DATE format=date09.
FROM
   sashelp.cars a
;
quit;

http://support.sas.com/documentation/cdl/en/mcrolref/67912/HTML/default/viewer.htm#p1f5qisx8mv9ygn1dikmgba1lmmu.htm

【讨论】:

    【解决方案2】:

    你工作太努力了,只是让可怜的旧 SAS 感到困惑。而不是使用宏引用,只需使用正确的引号字符开头。 SAS 不关心您使用哪个引号字符,但不会针对宏触发器评估单引号内的文本,而双引号内的文本是。所以'&eval_date'd 不会解析宏变量引用,而"&eval_date"d 会。

    %let Eval_Date="%sysfunc(intnx(month,%sysfunc(inputn(201603,yymmn6)),0,E),date9)"d; 
    

    【讨论】:

      【解决方案3】:

      a.* 后面少了一个逗号

      【讨论】:

      • 感谢您查看此内容。但是,当我简化查询以发布此内容时,这是一个转录问题。逗号存在于实际查询中。我已编辑问题以包含逗号。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-02
      • 1970-01-01
      相关资源
      最近更新 更多