SAS条件执行proc sql

时间:2015-10-15 20:57:45

标签: sas

我在SAS中创建了一个存储过程,提示用户选择一个类似2015_10的月/年组合。然后,从下一个框中,他们可以单击日历并选择一个时间戳的开始日期和时间戳的结束日期。

我想将其合并为一步,用户只选择开始日期和结束日期。但是,我的源表位于SQL Server中,表格按月分区,表格的名称如此datatabel_2015_10,其中最后两位数字代表月份。一旦用户选择了月份,我就会对该表进行proc sql查询,之后又有另一个查询只能拉出介于开始日期和结束日期之间的行,那些是在MS SQL中存储为字符串的time1和time2服务器看起来像这样30JAN2015:19:52:29

如何对其进行编码以消除月/年提示,并且只有两个选项,即startdatetimeenddatetime,仍然可以获得查询。 连接每月表不是一个选项,因为它们很大并且即使我使用传递查询也会永远运行。 请帮忙。 感谢

LIBNAME SWAPPLI ODBC ACCESS=READONLY read_lock_type=nolock noprompt="driver=SQL server; server=XXX; Trusted Connection=yes; database=XXX" schema='dbo'; 

proc sql; 
  create table a as 
  select 
  startdate_time, 
  enddate_time 
  from SWAPPLI.SQL_DB_2015_10 
quit;

proc sort data=a out=b; 
  by startdate_time, enddate_time 
where enddate_time between "&startdate"dt and "&enddate"dt; 
run;

1 个答案:

答案 0 :(得分:1)

您可以直接询问时间戳的开始和结束来删除步骤。

然后你可以从所选的时间戳中推断出YEAR和MONTH。

对于& startdate = 30JAN2015:19:52:29,您可以通过在此后创建2个子字符串来创建2个宏变量:

%let startdate = 30JAN2015:19:52:29;

%let YEAR=%SUBSTR("&startdate",4,3);
%let MONTH=%SUBSTR("&startdate",7,4);

%PUT YEAR=&YEAR;

%PUT MONTH=&MONTH;

结果:

        %PUT YEAR=&YEAR;
YEAR=JAN

         %PUT MONTH=&MONTH;
MONTH=2015

然后你可以创建一个%if条件来匹配JAN和01,FEB和02,等等... MONTH将是01 所以你不需要再询问这些信息了两次。

然后您可以通过以下方式选择数据集:

proc sql; 
  create table a as 
  select 
  startdate_time, 
  enddate_time 
  from SWAPPLI.SQL_DB_&YEAR._&MONTH. 
quit;

proc sort data=a out=b; 
  by startdate_time, enddate_time 
where enddate_time between "&startdate"dt and "&enddate"dt; 
run;

您应该将选择限制为MONTH,并且不允许选择几个月,例如start = 01JAN和end = 01MAR。因为选择仅在数据集SQL_DB_2017_01上,而不考虑end = 01MAR。