3

我正在尝试编写一个 SQL 语句,它允许我检索在 9 月份创建的所有订单,但运气不佳。

不工作:

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 提供的解决方案——就可以使用它。请记住,可以使用TRUNC,TO_CHAR和等功能EXTRACT,但仍然可以避免完全扫描。

于 2012-09-25T04:08:29.403 回答
0

无需使用 重复该created_datebetween,即使查询继续利用该列上的索引(如果有),通过使用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 回答