2017-09-12 9 views
2

DT_IDが数値データ型の列で、この列に格納されている値の形式は、日付が'YYYYMMDD'の次の問合せがあります。数値の変換は、oracleのパフォーマンスに影響します

私の下の質問では、毎週のレポートのために月曜日から日曜日まで先週のデータを取得したいと思っています。このクエリは非常に高速です。

select ID,NAME 
from TEST_REPORT 
where 
DT_ID between 20170904 and 20170910; 

しかし、これはハードコードされた日付であり、私はそれを動的にしたいと思います。

select ID,NAME 
from TEST_REPORT 
where 
DT_ID>= next_day(trunc(sysdate), 'MONDAY') - 14 and 
      DT_ID< next_day(trunc(sysdate), 'MONDAY') - 7; 

しかし、それは、このエラーを与える:私はこのクエリを試してみました

expecting Number and got date

それがパフォーマンスの問題の多くを結果のクエリ以下のように私が今までにこの番号を変換します。より良いパフォーマンスでダイナミックにする方法はありますか?

select ID,NAME 
from TEST_REPORT 
where 
to_date(DT_ID,'YYYYMMDD') >= next_day(trunc(sysdate), 'MONDAY') - 14 and 
      (DT_ID,'YYYYMMDD') < next_day(trunc(sysdate), 'MONDAY') - 7; 
+0

は、テーブル定義を示してください、と列のデータ型、および例えば、テーブルデータ。ありがとう – OldProgrammer

答えて

3

あなたは、文字列に日付値に変換してから数字にすることができます

select ID,NAME 
from TEST_REPORT 
where DT_ID >= to_number (to_char (next_day(trunc(sysdate), 'MONDAY') - 14, 
          'YYYYMMDD')) 
    and DT_ID < to_number (to_char (next_day(trunc(sysdate), 'MONDAY') - 7, 
          'YYYYMMDD')); 
+0

はいそれは良い性能で動作します – Andrew

関連する問題