Tengo sql algo como esto:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Esto devuelve 10 filas y TIME_CREATED = '26 -JAN-2011 '
Ahora, cuando hago esto, no recupero ninguna fila,
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Sacó lo más grande que fuera
¿Alguna razón por la que?
sql
oracle
time
date-arithmetic
sanjeev40084
fuente
fuente
01
lugar deJAN
(más el formato apropiado, por supuesto) para asegurarse de que su código se ejecute sin problemas en cualquier sistema.Respuestas:
Sí: TIME_CREATED contiene una fecha y una hora . Úselo
TRUNC
para quitar el tiempo:SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
ACTUALIZACIÓN:
Como Dave Costa señala en el comentario a continuación, esto evitará que Oracle use el índice de la columna
TIME_CREATED
si existe. Un enfoque alternativo sin este problema es este: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
fuente
BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
?between
por la ambigüedad. Suena como si fuera exclusivo de los límites cuando en realidad es inclusivo. Por eso lo evito. Además, en este ejemplo concreto, no sería lo mismo.También puede utilizar lo siguiente para incluir la parte de TIEMPO en su consulta:
SELECT EMP_NAME , DEPT FROM EMPLOYEE WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
fuente
También puedes hacer:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
fuente
Esto se debe a que una
DATE
columna en Oracle también contiene una parte de tiempo. El resultado de lato_date()
función es una fecha con la hora establecida en00:00:00
y, por lo tanto, probablemente no coincida con ninguna fila de la tabla.Deberías usar:
SELECT EMP_NAME, DEPT FROM EMPLOYEE WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
fuente
Como otras personas han comentado anteriormente, el uso de TRUNC evitará el uso de índices (si había un índice en TIME_CREATED). Para evitar ese problema, la consulta se puede estructurar como
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 es 1 segundo menos que la cantidad de segundos en un día.
fuente