2010-02-26 24 views
10

Abbiamo una tabella con una colonna DATE d.Oracle: confronta le date solo per l'ora

Mi piacerebbe ottenere tutte le righe in cui la colonna d è maggiore/minore di qualche valore, indipendentemente dalla data.

Per esempio

|  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| 
-------------------- 

Per esempio, se voglio tutti i record segnati dopo 5:00:

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

Ciò dovrebbe restituire un solo record

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

I don' so se questo è il modo migliore per farlo, ma ottengo un errore sulla funzione di estrazione:

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

C'è un modo migliore per farlo? Che cosa è successo con quell'errore? estratto disponibile solo per sysdate, come in tutti gli esempi che ho trovato?

Grazie in anticipo

+0

Così hai trovato una soluzione generica, lavorando con il campo ORA e EXTRACT? Ho bisogno di una soluzione cross DBMS compatibile per questo. –

risposta

12

come su questo?

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

A proposito, 'ora' supportato solo per il tipo di timestamp basato su ricerca google. Le prestazioni sono importanti per questo caso? Solo curioso. – exiter2000

+0

Sì, le prestazioni sono un problema – Tom

+2

Considera un indice basato sulle funzioni nell'espressione sopra: 'CREATE INDEX my_table_fbi01 su my_table (to_char (date_col, 'HH24'));' Tuttavia, dato il tuo esempio, le prestazioni probabilmente non sarebbero ancora ottimali. Supponendo che non vi sia alcuna variazione nel modello orario della colonna della data, otterresti comunque un terzo dei dati, quindi un indice non ti aiuterà. –

4

provare questo:

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

Non hai ancora un database Oracle per testare con al momento, ma penso che il seguente dovrebbe funzionare:

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

Ma io non capisco perché il CAST sarebbe necessaria come this page dice quell'ORA è un campo valido in una DATA.

Condividi e divertiti.

+1

Questa [pagina] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm) spiega perché è necessario eseguire il cast in TIMESTAMP: _ "EXTRACT interpreta expr come un tipo di dati datetime ANSI. Ad esempio, EXTRACT tratta DATE non come Oracle DATE legacy ma come ANSI DATE, senza elementi temporali. "_ –