DD MON YYYY到YYMMn6

时间:2018-06-18 07:34:57

标签: sql date sas prompt

我在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;

关于我哪里出错的任何想法?

2 个答案:

答案 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;