2015-10-15 39 views
0

我在SAS中创建了一个存储过程,提示用户选择月份/年份组合,如下所示:2015_10。然后从下一个框中,他们可以点击一个日历,并选择一个时间戳的startdate,enddate也是一个时间戳。SAS条件执行过程sql

我想结合这一步,用户只选择开始和结束日期。但是,我的源表位于SQL Server中,并且表格按月份进行分区,并且这些表格的名称类似于此datatabel_2015_10,其中最后两位数字表示月份。一旦用户选择月份,我有proc sql查询该表,然后在那之后有另一个查询来只拉起落在开始日期和结束日期之间的行,这些行是time1和time2作为字符串存储在MS SQL中看起来像这样的服务器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; 
+0

请附上您的存储过程的代码的相关部分的问题 – mjsqu

+0

LIBNAME SWAPPLI ODBC ACCESS = READONLY read_lock_type = NOLOCK NOPROMPT = “司机= SQL服务器; 服务器= XXX; 信任连接= YES; 数据库= XXX”模式= 'DBO'; proc sql; 创建表格为 select startdate_time,enddate_time from SWAPPLI.SQL_DB_2015_10 quit; proc sort data = a out = b; by startdate_time,enddate_time 其中enddate_time位于“&startdate”dt和“&enddate”dt之间; 跑; – user601828

回答

1

可以删除一个循序渐进的要求直接时间戳的开始和结束。

然后,您可以从所选时间戳中推导出YEAR和MONTH。

对于& STARTDATE = 30JAN2015:19:52:

%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 

然后可以创建29,则可以通过创建2子以下这个创建2宏变量a%如果条件匹配JAN与01,FEB与02,等... 这里MONTH将是01 因此,您不需要再次询问信息2次。

然后你就可以做这个选择数据集:

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; 

你或许应该限制选择到一个月,不允许选择通过几个月一样开始= 01JAN和结束= 01MAR。因为选择只会在数据集SQL_DB_2017_01上进行,而不会考虑end = 01MAR。