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