2010-02-26 32 views
10

Tenemos una tabla que tiene una columna DATE d.Oracle: compare las fechas solo por la hora

Me gustaría obtener todas las filas donde la columna d es mayor/menor que algún valor, independientemente de la fecha.

Por ejemplo

|  d   | 
------------------- 
|2009/11/1 15:55:23| 
-------------------- 
|2009/11/2 15:55:23| 
-------------------- 
|2009/11/3 15:55:23| 
-------------------- 
|2009/11/3 17:55:23| 
-------------------- 

Por ejemplo, si quiero que todos los registros marcados después de las 5 PM:

select d 
from my_table 
where extract(hour from d) > TO_DATE ('17:00:00','HH24:MI:SS') 

Esto debería devolver sólo un registro

|2009/11/3 17:55:23| 

I don' Sé si esta es la mejor manera de hacerlo, pero aparece un error en la función de extracción:

ORA-30076: invalid extract field for extract source 
Cause: The extract source does not contain the specified extract field. 

¿Hay una mejor manera de hacerlo? ¿Qué pasa con ese error? extraer solo disponible para sysdate, como en todos los ejemplos que he encontrado?

Gracias de antemano

+0

¿Encontraste una solución genérica, trabajando con el campo HOUR y EXTRACT? Necesito una solución compatible con DBMS cruzada para esto. –

Respuesta

12

¿Qué tal esto?

select d 
from my_table 
where to_char(d,'HH24') > '16'; 
+0

Por cierto, 'hora' solo es compatible con el tipo de sello de tiempo basado en la búsqueda de google. ¿El rendimiento es importante para este caso? Sólo curioso. – exiter2000

+0

Sí, el rendimiento es un problema – Tom

+2

Considere un índice basado en funciones en la expresión anterior: 'CREATE INDEX my_table_fbi01 en my_table (to_char (date_col, 'HH24'));' Sin embargo, dado su ejemplo, el rendimiento probablemente aún no sea óptimo. Suponiendo que no hay variación en el patrón horario de su columna de fecha, todavía estaría recibiendo 1/3 de los datos, por lo que un índice no lo ayudaría allí. –

4

Prueba esto:

select d from my_table 
where (d-trunc(d)) > 16/24; 
7

¿No tiene una base de datos Oracle para probar con en el momento pero creo que el siguiente debería funcionar:

SELECT * 
    FROM MY_TABLE t 
    WHERE EXTRACT(HOUR FROM CAST(t.D AS TIMESTAMP)) > 16; 

Pero no entiendo por qué se necesitaría al reparto como dice this page esa HORA es un campo válido en una FECHA.

Comparte y disfruta.

+1

Esta [página] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm) explica por qué necesita enviar a TIMESTAMP: _ "EXTRACT interpreta expr como un tipo de datos de fecha y hora ANSI. ejemplo, EXTRACT trata a DATE no como DATE de Oracle heredado sino como ANSI DATE, sin elementos de tiempo. "_ –

Cuestiones relacionadas