2010-03-08 12 views
37

Estoy tratando de recuperar registros de la tabla sabiendo que la fecha en la columna contiene la fecha y la hora.Seleccionar de la tabla solo para saber la fecha sin tiempo (ORACLE)

Supongamos que tengo una tabla llamada t1 que contiene solo dos columnas name y date respectivamente.

Los datos almacenados en la columna datan así 8/3/2010 12:34:20 PM.

Quiero recuperar este registro por esta consulta por ejemplo (nota no pongo el tiempo):

Select * From t1 Where date="8/3/2010" 

Esta consulta me dan nada!

¿Cómo puedo recuperar date conociendo solo date sin el tiempo?

Respuesta

68

DATE es una palabra clave reservada en Oracle, entonces estoy usando column-name your_date en su lugar.

Si usted tiene un índice en your_date, me gustaría utilizar

WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD') 
    AND your_date < TO_DATE('2010-08-04', 'YYYY-MM-DD') 

o BETWEEN:

WHERE your_date BETWEEN TO_DATE('2010-08-03', 'YYYY-MM-DD') 
        AND TO_DATE('2010-08-03 23:59:59', 'YYYY-MM-DD HH24:MI:SS') 

Si no hay ningún índice o si no hay demasiados registros

WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD') 

debería ser suficiente. TRUNC sin parámetro elimina horas, minutos y segundos de DATE.


Si el rendimiento que realmente importa, considerar la posibilidad de un Function Based Index en esa columna:

CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date)); 
+0

problema resuelto Gracias chicos – Abdulrhman

+0

@ Abdulrhman - ¡debería aceptar la respuesta que funcionó para usted! – Leslie

+0

trunc() funcionó para mí! ¡Gracias! –

2

Se podría utilizar la función para obtener entre todos los registros entre el 2010-08-03 00: 00: 00: 000 Y 2010-08-03 23: 59: 59: 000

+3

'BETWEEN' significa'> = AND <= ', por lo que su consulta también devolverá filas con' date = 2010-08-04 00: 00: 00'. –

+0

Buena captura, fija. Tu respuesta fue mucho más completa +1. –

+1

+1 ahora está solucionado, ya que su respuesta es correcta también :) –

0

Pruebe la siguiente manera.

Select * from t1 where date(col_name)="8/3/2010" 
+2

Lo sentimos, pero esto no funciona con Oracle. Me da un 'ORA-00936: expresión faltante'. –

+0

En Oracle, las comillas dobles se utilizan para delimitar un identificador; las comillas simples se usan para los literales de cadena. –

+1

No funciona .. – codewarrior

3

Personalmente, suelo ir con:

select * 
from t1 
where date between trunc(:somedate)   -- 00:00:00 
      and  trunc(:somedate) + .99999 -- 23:59:59 
+1

1/86400 es un número mágico que todos los tipos de Oracle deben conocer. –

2

convertir su columna de fecha en el formato correcto y comparar:

SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010' 

Esta parte

to_char(my_table.my_date_col,'MM/dd/yyyy') 

resultará en cadena '8/3/2010'

0

trunc(my_date,'DD') le dará sólo la fecha y no el tiempo en Oracle.

Cuestiones relacionadas