(ユーザーインターフェイスからの)DATE
タイプのOracleストアドプロシージャに変数があり、TIMESTAMP
タイプの別の変数があります(データベースは、実行中のコードにユーザーが入力するものよりも正確です)ストアドプロシージャ)。
私はこのようなことをしたいと思います:(疑似コード)
select * from MYDATABASE where inputDate = extract(date from myDatabaseTimeStamp);
しかし、これを試すとコンパイルエラーが発生します。これのための実際のコードソリューションは何ですか?
ユーザーインターフェースのDATEに00:00:00(真夜中)以外の時刻が含まれる可能性があり、ユーザーインターフェースのDATEとTIMESTAMPが同じ日(同じ時間または分ではないか?)これを試して:
_...
myDatabaseDate DATE;
myDatabaseNextDay DATE;
BEGIN
-- Change TIMESTAMP to a DATE type with CAST, then TRUNCate time to 00:00:00.
myDatabaseDate := TRUNC( CAST(myDatabaseTimeStamp as DATE) );
myDatabaseNextDay := myDatabaseDate + 1;
SELECT something into some_var
FROM MYDATABASE
WHERE inputDate < myDatabaseNextDay
AND inputDate >= myDatabaseDate;
...
_
注1:「inputDate」はデータベースの列であり、インデックスを付けることができるため、TRUNC(inputDate)
を実行したくないので、インデックスは使用されません。
注意2:SQLステートメントの前に [〜#〜] cast [〜#〜] を実行すると、このPL/SQLコンパイルの警告が回避されます。 PLW-07204:列型からの変換が行われる可能性があります次の最適なクエリプランで ...編集:10.2 XEでこれをテストした後、「myDatabaseDate + 1」でも警告が表示されるため、コンパイラーを満足させるにはあまりにも多くのことを行っているようですが、「myDatabaseNextDay: = myDatabaseDate + 1; "
trunc()
を使用できます:
SELECT *
FROM my_table
WHERE trunc(date_col) = to_date('2012-09-08', 'YYYY-MM-DD')
;
または、あなたの例では:
SELECT *
FROM mydatabase
WHERE inputDate = trunc(myDatabaseTimeStamp);
SQLFiddle 、および documentation の実際の例を参照してください。