2010-01-10 39 views
11

utilizando un 10g de Oracle db Tengo una tabla o menos así:oráculo rango de fechas

create table x(
ID NUMBER(10) primary key, 
wedding DATE NOT NULL 
); 

cómo puedo

select * from x where wedding is in june 2008??? 

Sé que es probable que sea una tarea fácil, pero no pude encontrar cualquier respuesta satisfactoria hasta el momento. La ayuda es muy apreciada.

Respuesta

19

Uso:

SELECT * 
    FROM x 
WHERE x.wedding BETWEEN TO_DATE('2008-JUN-01', 'YYYY-MON-DD') 
          AND TO_DATE('2008-JUL-01', 'YYYY-MON-DD') 

El uso de TO_DATE construye una cita con una porción de tiempo de 00:00:00, lo que requiere la fecha de finalización de ser un día antes a menos que desee usar la lógica para corregir la actual la fecha es un segundo antes de la medianoche. No probado:

TO_DATE('2008-JUN-30', 'YYYY-MON-DD') + 1 - (1/(24*60*60)) 

Eso se debe añadir un día para el 30-Jun-2008, y luego restar un segundo para devolver una fecha final de 30-Jun-2008 23:59.

Referencias:

+2

El tipo de FECHA en ORACLE contiene el componente de fecha y hora. La expresión TO_DATE ('2008-JUN-30', 'YYYY-MON-DD') equivale a '2008-JUN-30 00:00:00'. Si los datos contienen información de tiempo, entonces puede tener problemas con esta expresión. La boda que ocurre en '2008-JUN-30 16:00:00' (4pm), no estará en el conjunto de resultados de la consulta anterior. – zendar

+1

así que debo configurarlo ENTRE el 01 de junio y el 01 de julio. – Hoax

+0

Re "Uso de TO_DATE ..." - Acepto que es un poco más complicado si tienes tiempo y citas juntos. Su límite superior actual: 'TO_DATE ('2008-JUL-01', 'YYYY-MON-DD')' ahora puede obtener bodas de 2008 a JUL-01 que no tienen tiempo ingresado (supongo que no hay medianoche) bodas), por lo que esta consulta puede ser inexacta. Probablemente necesite elaborar casos extremos y agregar algún comentario sobre la parte de tiempo y el operador BETWEEN. – zendar

2

Esto es ANSI SQL, y apoyado por Oracle como de la versión 9i

SELECT * 
FROM x 
WHERE EXTRACT(YEAR FROM wedding) = 2008 
AND EXTRACT(MONTH FROM wedding) = 06 

solución clásica con Oracle específica TO_CHAR():

SELECT * 
FROM x 
WHERE TO_CHAR(wedding, 'YYYY-MMM') = '2008-JUN' 

(estas últimas soluciones eran compatibles cuando los dinosaurios todavía caminaban por la tierra)

+2

Ninguno usará un índice (si existe) en la columna 'boda'. –

+0

Además, si los errores PLW están habilitados, ambas opciones darán como resultado una conversión que se aleja del error del tipo de datos. –

+0

@OMG Ponies - si, tienes razón. La solución intermedia es mucho mejor para el rendimiento. Sin embargo, no estoy seguro de lo que quiere decir con los errores de PLW. ¿Tienes un puntero para mí? TIA –

Cuestiones relacionadas