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.