yyyy to_date to_char formato fecha ejemplos sql oracle time date-arithmetic

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