2015-04-07 2 views
-1

Comment puis-je réduire la déclaration suivante:comparaison date avec le format datetime

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

Répondre

1

dans la deuxième partie de l'où troncature condition n'est pas nécessaire:

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

La fonction trunc renvoie une date . Vous n'avez pas besoin de convertir cela en char et de revenir à ce jour.

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

Il vous semble que vous essayez de récupérer des ordres qui étaient commandés avant Mars, mais annulé dans Mars? Si oui, j'éviterais des filtres comme celui-ci: to_char(trunc(Cancel_Date,'MONTH'),'dd/mm/yyyy')='01/03/2015'; Si vous avez un index sur cancel_date, alors il ne sera pas utilisé (sauf si vous avez un indice basé sur la fonction sur cette colonne!). Je ferais ce qui suit:

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

Dans la requête ci-dessus j'utilise littéraux date ANSI (Pris en charge dans Oracle depuis 9i, je crois) plutôt que d'utiliser TO_CHAR(), TO_DATE(), etc. Et je ne suis pas l'application des fonctions cancel_date ou order_date afin que l'optimiseur puisse utiliser les index sur ces colonnes (si elles existent).

Sur une note de côté utilisant SELECT * plutôt que de nommer explicitement les colonnes dont vous avez besoin n'est généralement pas considéré comme une bonne pratique.