sql - to_date - Oracle DateTime en Where Clause?
to_char oracle format (5)
Como otras personas han comentado anteriormente, el uso de TRUNC evitará el uso de índices (si hubo 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 siendo 1 segundo menos que el número de segundos en un día.
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 consigo ninguna vuelta,
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE(''26/JAN/2011'',''dd/mon/yyyy'')
-> Tomó el mayor que fuera
¿Alguna razón por qué?
Esto se debe a que una columna DATE
en Oracle también contiene una parte de tiempo. El resultado de la función to_date()
es una fecha con el tiempo configurado en 00: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'')
Sí: TIME_CREATED contiene una fecha y una hora . Use TRUNC
para quitar el tiempo:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE(''26/JAN/2011'',''dd/mon/yyyy'')
ACTUALIZAR:
Como señala Dave Costa 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
También podrías hacer:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE ''2011-01-26''
También puede usar lo siguiente para incluir la porción TIME 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'');