3

9月に作成されたすべての注文を運がなくても取得できるSQLステートメントを作成しようとしています。

動作しない:

select order_number, created_date
from orders
where created_date in to_date('2012-09', 'YYYY-MM');

動作しているが長すぎる:

select order_number, created_date
from orders
where trunc(created_date) between to_date('2012-09-01', 'YYYY-MM-DD') and to_date('2012-09-30', 'YYYY-MM-DD');
4

4 に答える 4

5

どうですか:

select order_number, created_date
from orders
where created_date >= to_date('2012-09-01', 'YYYY-MM-DD') 
and created_date < to_date('2012-10-01', 'YYYY-MM-DD');

created_dateインデックスをうまく活用できるように、手つかずのままにしておく必要があります。

于 2012-09-25T04:09:29.213 に答える
4

次のコードを使用します。

select order_number, created_date
from orders
where TO_CHAR(created_date, 'YYYY-MM') in '2012-09';
于 2012-09-25T04:05:35.797 に答える
1

を使用するバージョンの方がパフォーマンスが向上すると思いますbetweenが、いつでも逆の方法を試すことができます。

WHERE TO_CHAR(created_date, 'YYYY-MM') = '2012-09';

別のオプションはEXTRACTです:

WHERE 
  EXTRACT(year FROM created_date) = 2012 
  AND EXTRACT(month FROM created_date) = 9;

アップデート:

Oracle 8i以降、関数ベースのインデックスを使用して、この種のクエリのパフォーマンスを向上させることができます。

CREATE INDEX ORDS_CRTD_DT_YYYY_MM_IDX 
   ON orders (TO_CHAR(created_date, 'YYYY-MM'));

もちろん、@ Robが提供するような問題のより簡単な解決策がある場合は、理由もなくインデックスを作成しないようにする必要があります(書き込み操作が遅くなります)。TRUNCTO_CHARなどの関数EXTRACTを列とともに使用しても、フルスキャンを回避できることを覚えておいてください。

于 2012-09-25T04:08:29.403 に答える
0

created_dateを使用して列を繰り返す必要はありません。クエリでも、その月の最初の日付と最後の日付をbetween使用して、その列のインデックスを利用します(ある場合) 。trunc(to_date('2012-09','yyyy-mm'),'Month')last_day(to_date('2012-09','yyyy-mm'))

with orders(order_number, created_date) as
(
 select 1, date'2012-08-31' from dual union all
 select 2, date'2012-09-01' from dual union all
 select 3, date'2012-09-02' from dual union all
 select 4, date'2012-09-29' from dual union all   
 select 5, date'2012-09-30' from dual union all   
 select 6, date'2012-10-01' from dual    
),
  param(month) as
(
 select to_date('2012-09','yyyy-mm') from dual    
)    
select order_number, created_date 
  from orders
 cross join param
 where created_date between trunc(month,'Month')
                        and last_day(month);

ORDER_NUMBER    CREATED_DATE
------------    ------------
2               01.09.2012 
3               02.09.2012 
4               29.09.2012 
5               30.09.2012 

Demo

于 2019-02-18T15:42:06.343 に答える