我在Proc SQL中编写程序。该程序采用各种输入文件,其中文件名每月更改一次(即myfile_YYYY_MM或mytable_YYYYMM或mydata_YY_M)。
现在大部分程序都是动态的,并且要求用户在执行程序时通过提示输入报告日期。
"提示日期"代码中的(& Rep_Date。)格式为DD MON YYYY(31may2018),我需要设置一个宏变量来转换该值以格式化YYMMn6(即201805)。
语法如下:
%let Period = input("&Rep_Date."d,YYMMN.);
这在尝试创建d9变量和创建月/年变量时起作用,如下所示:
%let date = "&Rep_Date."d; /*Last day execution month*/
%let year = %sysfunc(year("&Rep_Date."d));
%let month = %sysfunc(month("&rep_Date."d));
出于某种原因,尝试将日期格式化为YYMMn6时同样不起作用。
我也尝试过创建变量" Period"在像这样的临时SAS表中,但又没有运气:
Data dates;
Period = input((&Rep_date.,6.), yymmn6.);
format Period yymmn6.;
Run;
关于我哪里出错的任何想法?
答案 0 :(得分:1)
我认为问题是因为您在input
语句中仅使用%let
函数。这将无法正确解决。正确的做法是将%sysfunc
宏函数与input
函数一起使用。问题是sysfunc
不适用于输入函数。因此,解决方案是使用%sysfunc(putn())
。这是一个例子。
编辑:
不确定你想要实现的是什么,但是%window
函数(假设你正在使用Windows)允许你通过提示输入,然后从输入创建一个宏变量。这是一个例子:
%global Period; %window info #5 @5 'Please enter date:' #5 @40 _Date 9 attr=underline; %display info; %put &_Date.; %macro da(Rep_Date=&_Date); %let Period = %sysfunc(putn("&Rep_Date."d,YYMMN.)); %put &Period.; %mend; %da();
这应该有用。
答案 1 :(得分:0)
出了什么问题?您正在混合上下文并将表示误解为文字(字面意思 - 双关语字面意图)。
简而言之
让您的宏代码使用日期表示值作为putN()
调用的%sysfunc
中使用的文字值的基础。
%let Rep_Date = 18-JUN-2018; * some date representation;
%let Period = %sysfunc(PUTN("&Rep_Date."D,YYMMN.));
%put NOTE: Period=%superq(Period);
长期
来自“SAS帮助和文档”(F1)中的词汇表
SAS日期值
一个整数,表示SAS软件中的日期。整数表示1960年1月1日和另一个指定日期之间的天数。例如,SAS日期值366表示日历日期1961年1月1日。
SAS日期常量一个字母“ddMMMyy'd”或“ddMMMyyyy'd”表示SAS语句中的日期。该字符串用引号括起来,后跟字符d(例如,'6JUL01'd,'06JUL01'd,'6 JUL2001'd或'06JUL2001'd)。
日期和时间格式
指示SAS如何将数值写为日期,时间和日期时间的说明。
日期和时间信息
指示SAS如何读取表示为日期,时间和日期时间的数值的说明。
DD MON YYYY
形式的文本值是日期表示的一种形式。可以使用信息DATE11.
中固有的指令输入包含四年数字的表格。 SAS日期文字(SAS日期常量)的格式为DDMONYYYY
D,有或没有各种空格,破折号,斜线等。
类似于“简短”的另一个代码变体将使用特定格式(date11.
)输入日期文本,而不是依赖于系统执行日期字面解释。
%let Rep_Date_text_representation = 18/JUN/2018;
%let Rep_Date_value = %sysfunc(inputN(&Rep_Date_text_representation,date11.));
%let Period = %sysfunc(putn(&Rep_Date_Value,yymmn.));
%put NOTE: &=Rep_Date_text_representation ;
%put NOTE: &=Rep_Date_value;
%put NOTE: &=Period;