2009-10-15 8 views
27

He pasado horas buscando en la web para una respuesta a esta pregunta ...Oracle: ¿cómo puedo seleccionar registros SOLAMENTE a partir de ayer?

Esto es lo que tengo actualmente:

select * 
from order_header oh 
where tran_date = sysdate-1 

Gracias de antemano.

+0

Todavía estoy registros desde el año pasado después de probar todas las sugerencias. –

+1

¿Cuál es el tipo de datos de la columna 'tran_date'? –

+0

Por favor, publique algunos datos de muestra y la consulta exacta que está ejecutando. Porque no hay absolutamente ninguna manera de que una consulta escrita correctamente restringida en SYSDATE-1 devuelva filas que coincidan con SYSDATE-366. – APC

Respuesta

58

Uso:

AND oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400 

Referencia: TRUNC

Llamar a una función en la tran_date significa que el optimizador no será capaz de utilizar un índice (suponiendo que existe uno) asociado con eso. Algunas bases de datos, como Oracle, admiten índices basados ​​en funciones que permiten realizar funciones en los datos para minimizar el impacto en tales situaciones, pero los DBA IME no los permitirán. Y estoy de acuerdo, no son realmente necesarios en este caso.

+4

Una pequeña advertencia: es posible que deba restar 1 segundo del límite superior. De lo contrario, si tiene un TRAN_DATE que es hoy a la medianoche, se devolverá en la consulta para las filas insertadas ayer. No esperaría que ese sea el comportamiento deseado. –

+1

Tenga en cuenta que esta solución no tiene en cuenta el horario de verano. Esta solución supone que cada día dura 24 horas, en el horario de verano 'day' dura 23 horas o 25 horas. – sbrbot

10
trunc(tran_date) = trunc(sysdate -1) 
+3

Si, como supongo, hay un índice en tran_date en el que se basa esta consulta, invocar una función en la columna indexada de esta manera diezmará el rendimiento de la consulta. – ninesided

+0

luego el método de rexem será útil. –

+1

En ese caso, puede agregar un índice basado en funciones: create index index_name on table_name (trunc (tran_date)); –

1
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd') 
+1

Oracle admite una amplia gama de operadores directamente en fechas, sin tener que recurrir a realizar comparaciones de cadenas. –

1

Si usted no apoya futuras transacciones con fecha entonces algo como esto podría funcionar:

AND oh.tran_date >= trunc(sysdate-1) 
1

Este comentario es para los lectores que han encontrado en esta entrada, pero están utilizando en lugar de MySQL Oracle! en MySQL puede hacer lo siguiente: Hoy

SELECT * 
FROM 
WHERE date(tran_date) = CURRENT_DATE() 

Ayer

SELECT * 
FROM yourtable 
WHERE date(tran_date) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) 
+0

Obtengo "ORA-00936 expresión faltante" en la fecha. Ver http://stackoverflow.com/questions/19143376/ora-00936-when-using-date-function-in-the-oracle-select-statement – NealWalters

Cuestiones relacionadas