2010-02-26 7 views
10

Wir haben eine Tabelle, die eine Spalte DATE D hat.Oracle: Vergleichen Sie Termine nur nach der Stunde

Ich möchte alle Zeilen erhalten, in denen die d-Spalte unabhängig vom Datum größer/niedriger als ein Wert ist.

Zum Beispiel

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

Zum Beispiel, wenn ich die Datensätze markiert nach 17.00 Uhr alle will:

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

Dies sollte Rückkehr nur einen Datensatz

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

I don‘ Ich weiß, ob dies der beste Weg ist, es zu tun, aber ich bekomme einen Fehler in der Extrakt-Funktion:

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

Gibt es einen besseren Weg, dies zu tun? Was ist mit diesem Fehler? Auszug nur für sysdate verfügbar, wie in allen Beispielen, die ich gefunden habe?

Vielen Dank im Voraus

+0

Haben Sie also eine generische Lösung gefunden, die mit dem HOUR-Feld und EXTRACT arbeitet? Ich brauche dafür eine Cross-DBMS-kompatible Lösung. –

Antwort

12

Wie wäre das?

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

Übrigens, "Stunde" nur für Zeitstempel-Typ basierend auf Google-Suche unterstützt. Ist Leistung für diesen Fall wichtig? Nur neugierig. – exiter2000

+0

Ja, Leistung ist ein Problem – Tom

+2

Betrachten Sie einen funktionsbasierten Index für den obigen Ausdruck: 'CREATE INDEX my_table_fbi01 auf my_table (to_char (date_col, 'HH24'));' Allerdings wäre die Leistung in Ihrem Beispiel wahrscheinlich immer noch nicht optimal. Unter der Annahme, dass das stündliche Muster Ihrer Datumsspalte nicht variiert, erhalten Sie immer noch 1/3 der Daten zurück, sodass Ihnen ein Index dort nicht weiterhilft. –

4

Try this:

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

Haben Sie eine Oracle-Datenbank nicht mit zur Zeit zu testen, aber ich denke, die folgenden sollte funktionieren:

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

Aber ich verstehe nicht, warum die CAST als this page benötigt würde, sagt diese HOUR ist ein gültiges Feld in einem DATE.

Teilen und genießen.

+1

Diese [page] (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm) erklärt, warum Sie in TIMESTAMP umgewandelt werden müssen: _ "EXTRACT interpretiert Ausdruck als ANSI-Datetime-Datentyp Beispiel: EXTRACT behandelt DATE nicht als veraltetes Oracle DATE, sondern als ANSI DATE ohne Zeitelemente. "_ –