2016-04-15 9 views
1

Wie können Sie nur den Zeitabschnitt eines Orace-Datumsfelds abfragen? Dh:Oracle-Abfragezeit (und nicht Datum)

select * from mytable 
where 
date_column < '05:30:00' 

die Abfrage Wollen Sie alle Zeilen zurück, wo die Zeit von date_column repräsentiert weniger als 5.30 unabhängig vom Datum.

+0

Es ist ein Datum Spalte –

Antwort

3

Sie können wie folgt versuchen:

select * from mytable 
where 
to_char(date_column, 'HH24:MI:SS') < '05:30:00' 
+0

scheint nicht zu funktionieren ... –

+0

leid es funktioniert! mein Fehler. –

+1

Alex Antwort funktioniert auch, aber das ist die einfachste zu folgen imho danke. –

2

können Sie sehen, wie weit das Datum, ab Mitternacht ist und Filter auf, dass:

select * from mytable 
where date_column - trunc(date_column) < 5.5/24 

Die date_column - trunc(date_column) Berechnung Sie geben einen Bruchteil ein Tag, wie es für date arithmetic normal ist. Die 5.5/24 ist der Bruchteil des Tages durch die Zeit um 05:30 dargestellt; 5,5 Stunden von 24 Stunden.

Wenn die Spalte ein Zeitstempel anstelle eines Datums ist, wird als Ergebnis der Subtraktion ein Intervalldatentyp angezeigt. Sie können an interval literal trotzdem verwenden, wenn Sie es vorziehen, oder finden es leichter zu verstehen als 5.5/24 (oder haben kompliziertere Zeiten zu vergleichen, die härter sind als Bruch auszudrücken):

select * from mytable 
where date_column < trunc(date_column) + interval '0 05:30:00' day to second; 

Auf diese Weise rund du bist Vergleichen Sie das Datum in Ihrer Spalte mit dem gekürzten Datum (dh Mitternacht an diesem Tag) und fügen Sie 5 Stunden 30 Minuten hinzu, also 05:30 Uhr am selben Tag.

Schnell Demo mit einfachen Daten in einem CTE und eine dritte sehr leichte Variante, aber sie alle das gleiche Ergebnis:

with mytable (date_column) as (
    select to_date('2016-04-15 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual 
    union all select to_date('2016-04-14 05:29:29', 'YYYY-MM-DD HH24:MI:SS') from dual 
    union all select to_date('2016-04-15 05:30:30', 'YYYY-MM-DD HH24:MI:SS') from dual 
) 
select * from mytable 
where date_column < trunc(date_column) + 5.5/24; 

DATE_COLUMN  
------------------- 
2016-04-15 05:29:29 
2016-04-14 05:29:29 

Beachten Sie aber, dass jede Manipulation der Spalte wie diese einen Index wird verhindern, dass benutzt. Wenn Sie dies regelmäßig tun müssen, kann es sinnvoll sein, eine virtuelle Spalte/einen Index hinzuzufügen, der diese Berechnung durchführt.

+0

Scheint nicht zu funktionieren ... –

+0

@MarcusLeon - das ist nicht sehr hilfreich. Was passiert, wenn Sie es ausführen? Welche Rohdaten haben Sie, welches Ergebnis erwarten Sie, was bekommen Sie? (Das Hinzufügen der ersten beiden zu der Frage könnte nützlich sein). Ich habe gerade mit einigen Testdaten überprüft und es bringt Zeilen zurück, wo die Zeit vor 05:30 an irgendeinem Datum ist. –

+0

zu hart to_char (Datum_Spalte, 'HH24: MI: SS') <'05: 30: 00 'sieht einfach aus –

0

Sie müssen die Zeit auf den neuesten Stand bringen, sonst führen Sie einfach einen String-Vergleich durch. Oracle hat nicht wirklich einen cleveren Weg, dies zu tun. Am einfachsten simulieren Sie beide Daten am selben Tag und führen den Vergleich durch.

I.e.

select * 
    from mytable 
where to_date ('01.01.2000 ' || to_char (date_column, 'hh24:mi:ss'), 'dd.mm.yyyy hh24:mi:ss') < 
      to_date ('01.01.2000' || '05:30:00', 'dd.mm.yyyy hh24:mi:ss')