Правильный синтаксис для даты макроса SAS в запросе Oracle - PullRequest
2 голосов
/ 23 марта 2012

Я пытаюсь запросить дополнения прошлой недели к базе данных Oracle в одночасье, и мне нужно использовать макросы для заполнения дат. Я могу выполнить запрос ниже, если я жестко закодировал фактические даты. Я пробовал двойные и одинарные кавычки в макросах &sd и &ed. Пожалуйста, сообщите.

data _null_;
sd = dhms(today()-7,00,00,00);
ed = dhms(today()-1,23,59,59);
call symput("sd", put(sd, datetime20.));
call symput("ed", put(ed, datetime20.));
run;
%put &sd &ed;

proc sql;
connect to oracle (user=x password=x path=x);
create table weekly_test as
select * from connection to oracle
(select * from x.Estimates
where state_fips_code = '41' 
and altered_date between 
    to_date('&sd','DDMONYYYY:HH24:MI:SS')
    and to_date('&ed','DDMONYYYY:HH24:MI:SS'));
disconnect from oracle;
quit;

ошибка

Ошибка выполнения ORACLE: ORA-01858: не числовой символ был найден там, где ожидалось число.

и с двойными кавычками

and altered_date between 
    to_date("&sd",'DDMONYYYY:HH24:MI:SS')
    and to_date("&ed",'DDMONYYYY:HH24:MI:SS'));

эта ошибка

ERROR: ORACLE prepare error: ORA-00904: "  21MAR2012:23:59:59": invalid identifier. SQL
statement: select * from X.Estimates where state_fips_code = '41' and altered_date
between to_date("  15MAR2012:00:00:00",'DDMONYYYY:HH24:MI:SS') and to_date("
21MAR2012:23:59:59",'DDMONYYYY:HH24:MI:SS').

Ответы [ 3 ]

2 голосов
/ 23 марта 2012

Лучше всего определить макропеременную с одинарными кавычками вокруг значений. На самом деле, я не думаю, что необходимо форматировать его как литерал datetime; просто создайте нормальную строку даты ANSI (ГГГГ-ММ-ДД), и вы также можете избавиться от вызова функции TO_DATE.

Например, попробуйте эти два утверждения:

%let SD=%str(%')%sysfunc( putn( %sysfunc(intnx(day,%sysfunc(today()) ,-7)),yymmdd10.))%str(%'); 
%let ED=%str(%')%sysfunc( putn( %sysfunc(intnx(day,%sysfunc(today()) ,-1)),yymmdd10.))%str(%');

Они определяют SD как сегодня () - 7 и ED как сегодня () - 1 (используя чистый макрос-код, а не шаг данных). Затем в вашем запросе укажите эти макропеременные без кавычек:

proc sql;
connect to oracle (user=x password=x path=x);
create table weekly_test as
select * from connection to oracle
(select * from x.Estimates
where state_fips_code = '41' 
and altered_date between &sd and &ed
);
disconnect from oracle;
quit;
0 голосов
/ 26 марта 2012

Это работает ....

%LET SD = %SYSFUNC(intnx(day,"&SYSDATE9"d,-7,b),date9.) ;
%LET ED = %SYSFUNC(intnx(day,"&SYSDATE9"d,-1,b),date9.) ;
%PUT &SD &ED ;

proc sql ;
  connect to oracle (user=x password=x path=x);
  create table weekly_test as
  select * from connection to oracle
  (select * from x.Estimates
   where state_fips_code = '41'
     and altered_date between %BQUOTE('&SD') and %BQUOTE('&ED')
  );
  disconnect from oracle ;
quit ;
0 голосов
/ 23 марта 2012

Большое спасибо, Боб.Я попробовал опубликованный вами код и получил ORA-01861: литерал не соответствует строке формата.В любом случае, вы заставили меня задуматься о правильном пути.Я просто добавил код, чтобы поместить одинаковые кавычки вокруг дат в шаге данных, и это сработало.Для тех, кто с подобными проблемами, код ниже.

data _null_;
sd = dhms(today()-7,00,00,00);
ed = dhms(today()-1,23,59,59);
call symput('sd',"'"|| trim(left(put(sd, datetime20.)))||"'");
call symput('ed', "'"||trim(left(put(ed, datetime20.)))||"'");
run;
%put &sd &ed;

proc sql;
connect to oracle (user=x password=x path=x);
create table weekly_test as
select * from connection to oracle
(select * from x.Estimates
where state_fips_code = '41' 
and altered_date between 
    to_date(&sd,'DDMONYYYY:HH24:MI:SS')
    and to_date(&ed,'DDMONYYYY:HH24:MI:SS'));
disconnect from oracle;
quit;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...