77 votes

Oracle DateTime dans la Clause where?

J'ai sql quelque chose comme ceci:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> Retourne les 10 lignes et TIME_CREATED = '26-JAN-2011'

Maintenant, quand je fais cela je n'ai pas toutes les lignes de retour,

SELECT EMP_NAME, DEPT
    FROM EMPLOYEE
    WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')

-> A pris le plus de temps

Quelle en est la raison?

139voto

Daniel Hilgarth Points 90722

Oui: TIME_CREATED contient une date et une heure. Utiliser TRUNC de la bande de l'époque:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

Mise à JOUR:
Comme Dave Costa points dans le commentaire ci-dessous, cela permettra d'éviter l'Oracle de l'aide de l'index de la colonne TIME_CREATED si elle existe. Une approche alternative sans ce problème est ceci:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy') 
      AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1

24voto

davidsr Points 254

Vous pouvez également utiliser celui-ci à inclure la partie HEURE de votre requête:

SELECT EMP_NAME
     , DEPT
  FROM EMPLOYEE 
 WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');

7voto

a_horse_with_no_name Points 100769

C'est parce qu'un DATE colonne Oracle contient également une partie du temps. Le résultat de l' to_date() fonction est une date avec l'heure pour 00:00:00 et donc probablement ne correspond pas à toutes les lignes dans la table.

Vous devez utiliser:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')

5voto

rationalSpring Points 2227

Que d'autres gens ont commenté ci-dessus, à l'aide de TRONC permettra d'éviter l'utilisation de l'index (si il y a un indice sur TIME_CREATED). Pour éviter ce problème, la requête peut être structurée comme

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') 
            AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;

86399 étant de 1 seconde de moins que le nombre de secondes dans une journée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X