2015-04-07 117 views
-1

如何縮短下面的語句:與日期時間格式比較日期

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

回答

1

在where條件截斷的第二部分是沒有必要的:

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

TRUNC返回日期的功能。您不需要將其轉換爲字符並再次返回日期。

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

它看起來像你想取回那名月前下令三月取消訂單?如果是這樣,我會避免這樣的過濾器: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 *而不是明確命名所需的列通常不被視爲最佳實踐。