2015-10-15 36 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。