2016-05-02 6 views
1
column name data type 
wp_stime   DATE 

QUERY:Oracle-Datenbank: Wählen Sie zwischen bestimmten Zeit des Tages

select wp_stime from workpaths; 

OUTPUT:

29-FEB-12 
29-FEB-12 
24-FEB-12 
24-FEB-12 
31-OCT-11 
12-DEC-11 
12-JAN-11 
19-OCT-11 
19-OCT-11 
11-AUG-11 
19-OCT-11 
21-NOV-11 
28-JUL-11 
02-AUG-11 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 
01-MAR-12 

Die Frage, wie ist, kann ich auswählen, die auf 09.00 Uhr bis 17.00 Uhr von wp_stime basiert?

QUERY 2:

select to_char(wp_stime, 'HH24:MI:SS') from workpaths; 

OUTPUT:

00:09:20 
00:10:17 
00:11:26 
00:42:50 
00:44:32 
00:45:35 
00:48:47 
00:51:45 
00:53:01 
00:56:43 
01:31:39 
01:34:01 
14:49:30 
01:53:32 
02:06:37 
02:36:54 
02:51:12 
+0

Sie versuchen, die Zeitkomponente eines Datums zu erhalten, die keine Zeitkomponente hat – cableload

+0

@cableload ich glaube nicht, dass Sie Recht haben, weil ich to_char konvertieren und Zeitstempel sehen kann. Siehe aktualisierte Abfrage über – ealeon

+0

Ok..ich sehe es jetzt ... Willst du also für irgendein Datum oben zwischen 9 und 5 wählen? – cableload

Antwort

1
select * from workpaths where to_char(wp_stime,'hh24') between 9 and 16; 

helfen sollte. Oracle extrahiert den Stundenanteil aus Ihrem Datumsfeld als String, und wenn Sie sehen, dass Sie mit Zahlen vergleichen, würde dies implizit in eine Zahl umgewandelt. So können Sie zwischen Stunden vergleichen. Effektiv gibt diese Abfrage Daten, deren Zeit größer als 9 Uhr und weniger als 5 Uhr ist.

EDIT:

17 mit 16 ersetzt wird, so dass die Werte bis 16.59.59 in Betracht gezogen werden würde.

EDIT 2:

explizit Um Zeichenfolge numerischen Casting durchführen:

select * from workpaths where to_number(to_char(wp_stime,'hh24')) between 9 and 16; 
+0

Dies wird definitiv nicht helfen, da Sie Strings vergleichen, und daher in lexikographischer (alphabetischer) Reihenfolge. 10 ist weniger als 9 und weniger als 17, daher wird 10 NICHT ausgewählt.ALSO: Extrahieren (Stunde von Spalte) Angenommen Spalte ist ein TIMESTAMP-Datentyp; Die auf diese Weise extrahierte Stunde ist ** nicht ** NLS abhängig. Wo kommen Sie auf solche Ideen? Auf der anderen Seite funktioniert der Extrakt (Stunde aus Spalte) ** nicht mit dem Datentyp DATE, wie in der Oracle-Dokumentation erläutert. – mathguy

+0

@mathguy: 1. Dies wird funktionieren. Weil ich zwischen Nummer 9 und Nummer 17 vergleiche, nicht die Zeichenfolge '9' und die Zeichenfolge '17'. Oracle versucht implizit, die Zeichenfolge, die ich als Zahl erhalte, zu übergeben, und in diesem Fall ist die Zeichenfolge immer numerisch. 2. NLS: Danke für die Korrektur. Ich hatte den Eindruck, dass das etwas mit NLS zu tun hatte, da NLS mir früher mit Datumsformaten Probleme bereitet hatte. Vielleicht wurde ich gelbgestimmt. 3. Was die Ideen anbetrifft, mangels Erfahrung. –

+1

Eigentlich haben Sie Recht, das wird funktionieren, weil Oracle die Zeichenfolge in eine Zahl konvertieren wird, nicht umgekehrt ... immer noch, implizite Konvertierungen ist nicht ideal. Sie können es explizit mit to_number (to_char (...)) machen - Sie verlieren nichts in der Effizienz, da Oracle dies sowieso tut (UND es muss raten), und es ist einfacher zu lesen und genau zu verstehen, was der Code tut. – mathguy

3

trunc (wp_stime) wird das gleiche Datum zurückkehren, mit dem Zeitabschnitt abgeschnitten nach unten auf 00:00:00 . Dann wird wp_time - trunc (wp_time) den "Bruchteil" (der Zeitteil von wp_time) zurückgeben. Dies wird als Anzahl in Tagen ausgedrückt. Sie möchten, dass dieser Bruchteil zwischen 9 und 17 Stunden oder 9/24 und 17/24 Tagen liegt.

Hier ist die Abfrage, vor der Testdaten in der WITH-Klausel. Für Sie, mit der Tabelle bereits bestehende, die komplette Abfrage ist nur die letzte Zeile in meinem Code:

with workpaths(wp_stime) as (
     select to_date('02-MAY-2016 13:30:44', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('15-FEB-2013 17:43:00', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('21-DEC-2015 2:15:27', 'dd-mon-yyyy hh24:mi:ss') from dual union all 
     select to_date('02-JAN-2016 10:22:09', 'dd-mon-yyyy hh24:mi:ss') from dual 
    ) 
select wp_stime from workpaths where wp_stime - trunc(wp_stime) between 9/24 and 17/24; 

Ausgang:

WP_STIME 
------------------ 
02-MAY-16 13:30:44 
02-JAN-16 10:22:09 
+0

Was, wenn wir auch nach Minuten filtern wollen? Sag bis 5.30 Uhr. –

+0

Dann vergleichen wir mit 17,5/24 oder 17/24 + 30/(24 * 60). – mathguy

0
select * from workpaths where to_date(wp_stime, 'hh24') between 9 and 17; 

funktionieren soll. In diesem Fall verwenden Sie anstelle eines char-Datentyps den Datentyp date.

+0

to_date wird einen DATE-Datentyp erstellen. Das kann nicht mit Zahlen wie 9 und 17 verglichen werden. Haben Sie sich etwas Mühe gegeben, Ihre Abfrage zu testen, indem Sie beispielsweise SYSDATE anstelle von wp_time verwenden? Es ist wirklich einfach. (Sie werden auch auf andere Probleme stoßen: to_date erfordert einen STRING-Parameter, Sie geben ein Datum an, daher führt Oracle einige implizite Konvertierungen durch, von denen einige fehlschlagen können.) – mathguy

Verwandte Themen