2015-10-15 4 views
0

Я создал сохраненный процесс в SAS, который предлагает пользователю выбрать комбинацию месяц/год, которая выглядит так: 2015_10. Затем из следующего окна они могут щелкнуть по календарю и выбрать начальную дату, которая является меткой времени, и enddate также временную метку.SAS условное выполнение proc sql

Я хотел бы объединить это в один шаг, когда пользователь выбирает дату начала и окончания. Однако моя исходная таблица находится в SQL Server, а таблицы разделены по месяцам, а таблицы называются так: datatabel_2015_10, где последние две цифры представляют месяц. После того, как пользователь выбирает месяц, у меня есть запрос sql sqq для этой таблицы, а затем после этого есть еще один запрос, чтобы вытащить только строки, которые попадают между датой начала и конечной даты, это time1 и time2, которые хранятся как символьные строки в MS SQL Сервер, которые выглядят как этот 30JAN2015:19:52:29

Как я могу закодировать это так, чтобы исключить месяц/год строки и только два выбора, а именно startdatetime и enddatetime, и до сих пор получить запрос. Объединение ежемесячных таблиц не является вариантом, потому что они огромны и работают навсегда, даже если я использую проход через запрос. Пожалуйста, помогите. Благодаря

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

Имя_библиотеки SWAPPLI ODBC ACCESS = READONLY read_lock_type = NOLOCK noprompt = "драйвер = SQL сервер; сервер = XXX; Trusted Connection = да; база = XXX" Schema = 'ДБО'; 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 где enddate_time между «& startdate» dt и «& enddate» dt; run; – user601828

ответ

1

Вы можете удалить шаг, задавая непосредственно метка времени начала и конца.

Затем вы можете вывести ГОД и МЕСЯЦ из выбранной временной метки.

Для & 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 

Тогда вы можете создать a%, если условие соответствовать JAN с 01, FEB с 02, ect ... Здесь 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 и не принимать во внимание конец = 01MAR.