2017-09-08 1 views
3

は、私が6つの小数小数で秒を使用して日付を持つデータセット(dt)を作成します。タイムスタンプ(6)を持つOracleテーブルからどのように選択するのですか? SASでは

data dt; 
    dt_21_aug_2017_23_59_59_999999 = '21aug2017:23:59:59.999999'dt; 
    dt_01_jan_1960_23_59_59_999999 = '01jan1960:23:59:59.999999'dt; 
run; 

それから私「フォーマット」データセット:

data dt_formatted; 
    set dt; 

    format dt_21_aug_2017_23_59_59_999999 datetime32.6; 
    format dt_01_jan_1960_23_59_59_999999 datetime32.6; 
run; 

私がいることがわかります6小数点は保存されます。

私はOracleのテーブルを作成するために dt_formattedを使用

libname tq84_ora oracle 
    user      = &ora_user 
    password     = &ora_password 
    path      = &ora_server 
; 

proc sql; 
    create table tq84_ora.dt_formatted as 
    select * from work .dt_formatted; 
quit; 

必要に応じて、テーブルが2つのtimestamp(6)列で、作成されます。私はどこ条件でテーブルを照会するてパスを使用する場合は

は、挿入されたレコードが返されます。

proc sql; 
    connect to oracle (
    user = &ora_user 
    pw = &ora_password 
    path = &ora_server 
); 

    select * from connection to oracle (
    select * 
    from dt_formatted 
    where dt_21_aug_2017_23_59_59_999999 = TO_TIMESTAMP(
     '21AUG2017:23:59:59.999999', 
     'DDMONYYYY:HH24:MI:SS.FF', 
     'NLS_DATE_LANGUAGE=American' 
    ) 
); 

    disconnect from oracle; 
quit; 

しかし、私はレコードを選択するために、伝統的な方法を使用している場合は、レコードが返されません。

proc sql; 
    select * from tq84_ora.some_dates_date_format 
    where dt_21_aug_2017_23_59_59_999999 = '21aug2017:23:59:59.999999'dt; 
quit; 

私はdt_01_jan_1960_23_59_59_999999に選択した場合しかし、レコードが返されます。

proc sql; 
    select * from tq84_ora.some_dates_date_format 
    where dt_01_jan_1960_23_59_59_999999 = '01jan1960:23:59:59.999999'dt; 
quit; 

理由は浮動小数点の制限のようです。それでも、Oracleは6桁の2017日付(つまり、9)を明確に格納しているので、これは奇妙です。

従来のproc sqlアプローチの2017レコードを選択するにはどうすればよいですか?

+0

datetime値としてSASに入ってくる変数ですか?最初のステップでSQLパススルー構文を使用してレコードをSASデータセットにプルすると、datetimeリテラルを使用してSASデータセットから選択できますか?これは、問題がDTリテラルの実際の数値への変換にあるのか、datetime定数をリモートデータベースにプッシュするのに役立つのかを知るのに役立ちます。 – Tom

答えて

1

LIKEを使用して日付を文字列として使用することは可能です。

data test; 
    format new_date $50.; 
    set work.entity; 

    new_date=datefrom; 
run; 

proc sql outobs=1; 
    select * from work.test where new_date like '%189%'; 
run; 

datefromは日付形式です。 new_dateは文字列として反応します。

あなたは、where句にしてSELECT文を行うことができますあなたの場合:

proc sql; 
     select * from work.dt_formatted where dt_21_aug_2017_23_59_59_999999 like '%jan2017:%' 
OR dt_21_aug_2017_23_59_59_999999 like '%feb2017:%' 
    ... 
    ; 

run; 
0

それが適切に小数点以下の桁を報告することはできませんいくつかのSASフォーマットのバグがあるようです1,000,000,000より大きい数のために。 DATETIME形式は実際には機能しますが、BEST、F、COMMAなどの他のSAS形式では機能しません。おそらく、これはSASが定数をリモートデータベースに転送する方法に影響を与えます。この問題を報告するにはSASサポートのチケットを開くことをお勧めします。

data test; 
    length int frac 8 format $42 str $26 dec $8; 
    frac=0.999999; 
    format int comma15. frac 8.6 ; 
    do int =10**9-1 to 10**9+1 by 1 ; 
    do format='datetime26.6','F26.6','best26.6','comma26.6'; 
     str=putn(int+frac,format); 
     dec=scan(str,-1,'.'); 
     num9s=countc(dec,'9'); 
     output; 
    end; 
    end; 
run; 

enter image description here

関連する問題