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



如何缩短以下语句:

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')

您似乎正在尝试检索在三月前订购已在三月取消的订单?如果是这样的话,我会避免这样的过滤器: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日期文字(我相信Oracle从9i开始就支持),而不是TO_CHAR()TO_DATE()等。我没有对cancel_dateorder_date应用任何函数,以便优化器可以使用这些列上的索引(如果存在的话)。

顺便说一句,使用SELECT *而不是显式命名所需的列通常不被认为是最佳实践。

在条件截断不必要的地方的第二部分:

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')
函数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')

相关内容

  • 没有找到相关文章

最新更新