web-dev-qa-db-ja.com

プロシージャのwhere句の日付変数とタイムスタンプ変数の比較

(ユーザーインターフェイスからの)DATEタイプのOracleストアドプロシージャに変数があり、TIMESTAMPタイプの別の変数があります(データベースは、実行中のコードにユーザーが入力するものよりも正確です)ストアドプロシージャ)。

私はこのようなことをしたいと思います:(疑似コード)

select * from MYDATABASE where inputDate = extract(date from myDatabaseTimeStamp);

しかし、これを試すとコンパイルエラーが発生します。これのための実際のコードソリューションは何ですか?

3
fa1c0n3r

ユーザーインターフェースの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; "

4
George3

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 の実際の例を参照してください。

2
dezso