将日期与日期时间格式进行比较

时间:2015-04-07 09:56:00

标签: sql oracle date compare

如何缩短以下声明:

select * from orders
where to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015'
  and state = 'Cancelled'
  and to_date(to_char(trunc(Order_Date,'MONTH'),'dd/mm/yyyy'),'dd/mm/yyyy') < to_date('01/03/2015','dd/mm/yyyy')

3 个答案:

答案 0 :(得分:2)

看起来您正在尝试在3月之前检索订购的订单,但在3月份取消?如果是这样,我会避免这样的过滤器:to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015';如果你在cancel_date上有一个索引,那么它就不会被使用(除非你在该列上有一个基于函数的索引!)。我会做以下事情:

SELECT * FROM orders
 WHERE status = 'Cancelled'
   AND cancel_date >= DATE'2015-03-01'
   AND cancel_date < DATE'2015-04-01'
   AND order_date < DATE'2015-03-01';

在上面的查询中,我使用ANSI日期文字(我相信自9i以来在Oracle中支持),而不是使用TO_CHAR()TO_DATE()等。我没有将任何函数应用于{{ 1}}或cancel_date以便优化器可以使用这些列上的索引(如果存在)。

在旁注上使用order_date而非明确命名所需的列通常不被视为最佳做法。

答案 1 :(得分:1)

在where条件truncate的第二部分中没有必要:

select * 
from orders
where to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015'
  and state = 'Cancelled'
  and Order_Date < to_date('01/03/2015','dd/mm/yyyy')

答案 2 :(得分:1)

函数trunc返回一个日期。您不需要将其转换为char并再次更新。

where trunc(Cancel_Date,'MONTH') = to_date('01/03/2015','dd/mm/yyyy')
and state = 'Cancelled'
and trunc(Order_Date,'MONTH') < to_date('01/03/2015','dd/mm/yyyy')