2011-05-12 10 views
5

Tengo la siguiente instrucción ejecutándose en una base de datos de Oracle.SQL ENTRE no funciona

SELECT br.Number 
    FROM Billing_History br 
WHERE TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-YY HH:MI:SS') 
            AND to_date('11-May-99', 'DD-Mon-YY HH:MI:SS') 

Definitivamente hay registros en esa tabla que se encuentran entre esas fechas. Y todos tienen un Número que los acompaña, pero por alguna razón esto no devuelve ningún Número. No devuelve nada en absoluto.

Las fechas en la base de datos están en este formato '01-Jan-11 '. Entonces parece que estoy poniendo las fechas en el formato correcto también. ¿Ves algo mal con el SQL que escribí?

+3

No veo cómo 01-Jan-11 es entre 01-Jan-99 y 11-May-99 ... –

+2

¿Qué tipo es la columna br.History_Date? –

+1

@Daniel Hilgarth que es solo un ejemplo para ilustrar el formato en el que se encuentran las fechas. No son la fecha exacta. El tipo de columna es Fecha. – Graham

Respuesta

11

El problema no es el componente de tiempo del modelo de formato, que es el componente 'YY', lo que significaría en su año se convierte en 2099, no 1999. Pruebe lo siguiente para ilustrar:

SQL> SELECT to_char(to_date('01-Apr-99','DD-Mon-YY'),'DD-Mon-YYYY') thedate 
     FROM dual; 

THEDATE 
----------- 
01-Apr-2099 

SQL> 

de cualquier uso o RR AAAA como un componente del modelo de formato para el año al usar fechas del siglo 20.

Editar:

Usted hace la afirmación "Las fechas en la base de datos se encuentran en este formato '01-enero-11' ." Esta es una interpretación común, pero incorrecta, de las fechas en Oracle. Los campos de FECHA siempre se almacenan en el mismo internal format. Se trata de cómo utiliza el modelo de formato en las funciones de conversión que dicta cómo se convierten los datos a/desde el formato interno.

+2

+1: Este es el problema, como se detectaría al usar las expresiones TO_DATE en la lista de selección de una consulta de doble. –

3

Prueba a eliminar la pieza del tiempo del segundo parámetro to_date:

to_date('11-May-99', 'DD-Mon-YY') 

O aún mejor:

to_date('11-05-1999', 'DD-MM-YYYY') 

Esto es más robusto, ya que es el lenguaje agnóstico y no necesita adivinar el siglo.

5

Use RR en su formato de fecha en lugar de YY. Probablemente es recoger esas fechas como 2099 en lugar de 1999.

SELECT br.Number FROM Billing_History br WHERE 
TRUNC(br.History_Date) BETWEEN to_date('01-Jan-99', 'DD-Mon-RR HH:MI:SS') 
AND to_date('11-May-99', 'DD-Mon-RR HH:MI:SS') 
+0

+1: Este es el problema, como se detectaría al usar las expresiones TO_DATE en la lista de selección de una consulta de doble. –