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

Sql 将日期与日期时间格式进行比较,sql,oracle,date,compare,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') 从订单中选择*

如何缩短以下语句:

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')
从订单中选择*
地址字符(trunc(取消日期,'MONTH'),'dd/mm/yyyy')='01/03/2015'
和状态='Cancelled'
和截止日期(截止日期(trunc(订单日期,'MONTH'),'dd/mm/yyyyy'),'dd/mm/yyyyy')<截止日期('2015年3月1日','dd/mm/yyyy'))

在不需要条件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')
选择*
从命令
地址字符(trunc(取消日期,'MONTH'),'dd/mm/yyyy')='01/03/2015'
和状态='Cancelled'
订单日期<截止日期('2015年3月1日','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')
其中trunc(取消日期,'MONTH')=截止日期('2015年3月1日','dd/mm/yyyy')
和状态='Cancelled'
和TRUC(订单日期,'MONTH')<截止日期('2015年3月1日','dd/mm/yyyy'))

看起来您正在尝试检索3月份之前订购但3月份取消的订单?如果是这样,我会避免这样的过滤器:
to_char(trunc(取消日期,'MONTH'),'dd/mm/yyyy')='01/03/2015'
;如果您在
cancel\u 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';
从订单中选择*
其中状态='已取消'
取消日期>=日期'2015-03-01'
并取消日期<日期'2015-04-01'
订单日期<日期'2015-03-01';
在上面的查询中,我使用的是ANSI日期文字(我相信Oracle自9i起就支持),而不是使用
TO_CHAR()
TO_date()
,等等。我没有应用任何函数来
取消日期
排序日期
,以便优化器可以使用这些列上的索引(如果它们存在的话)

在旁注中,使用
SELECT*
而不是显式命名所需的列通常不被认为是最佳做法