2012-03-22 8 views
1

これまでの週の追加をOracleデータベースに夜間に照会しようとしていて、マクロを使用して日付を入力する必要があります。実際の日付をハードコードする場合は、以下のクエリを実行することができます。私はマクロバール&sd&edに二重引用符を試しました。お知らせ下さい。OracleクエリーのSASマクロ日付の正しい構文

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 execute error: ORA-01858: a non-numeric character was found where a numeric was expected.

と二重引用符で

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'). 

答えて

1

最善の策は、値の周りの単一引用符を使用してマクロ変数を定義することです。実際には、日時リテラルとしてフォーマットする必要はないと思います。通常のANSI日付文字列(YYYY-MM-DD)を作成し、TO_DATE関数呼び出しを取り除くこともできます。 (純粋なマクロコードではなくデータ・ステップを使用して)1 - ()

%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():

例えば、これら二つの文を試みます。次に、クエリでこれらのマクロ変数を引用符で囲まずに参照してください。

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

Bobに感謝しています。 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; 
0

これは動作します....

%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 ; 
関連する問題