2016-08-02 6 views
0

Ich konnte sehen, Daten in der Tabelle mit last_update_date als 02-AUG-16Oracle SQL - kann nicht die Daten

aber bekommen, wenn ich frage:

select * from table_test where last_update_date = '02-AUG-16'

keine Zeilen zurück.

Was mache ich hier falsch? mit to_date und der Angabe ein Format

+0

Was ist der Datentyp dieses Feldes? –

+0

Überprüfen Sie das Datumsformat für die Spalte "last_update_date". – MMK

+0

ist es date type .. –

Antwort

2

die Daten in der Tabelle sind nicht alle um Mitternacht, aber Ihre NLS_DATE_FORMAT Einstellung zeigt, ist nicht die Zeit; und die implizite Konvertierung, die Sie gerade machen, sucht genau nach Mitternacht.

Wenn Sie das tun:

select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS') 
from table_test 
where last_update_date >= date '2016-08-02' 
and last_update_date < date '2016-08-03' 

werden Sie die Zeit Teil eines jeden Wertes sehen. Das where Klausel sucht nach einem Wert, der auf oder nach Mitternacht an dem Datum ist, das Sie angeben, und vor Mitternacht am nächsten Tag (obwohl Sie wahrscheinlich keine nach heute haben werden). Wenn du gerade getan hast:

select to_char(last_update_date, 'YYYY-MM-DD HH24:MI:SS') 
from table_test 
where last_update_date = date '2016-08-02' 

oder in der Tat, wie Sie implizit tun:

where last_update_date = to_date('02-AUG-16', DD-MON-RR') 

Sie keine Streichhölzer sehen, weil keiner der Wert von der ersten Abfrage zeigen die Zeit gefunden, als 00:00:00.

Sie sollten sich bei der Abfrage oder Anzeige von Daten nicht auf die Einstellung NLS_DATE_FORMAT Ihrer Sitzung verlassen. Es ist besser, immer to_char() für die Anzeige zu verwenden - im letzten möglichen Moment - und to_date() für Vergleiche, die format model Sie benötigen, oder using ANSI date literals, wie ich oben getan habe. (Sie sollten auch nicht auf andere NLS-Sitzungen antworten. In diesem Fall gehen Sie auch davon aus, dass Ihre NLS_DATE_LANGUAGE mit AUG übereinstimmt).

+0

Hey Alex .. Danke für Ihre detaillierte Antwort .. Sie sind fantastisch :) –

2

keine Datumsformat Probleme zu vermeiden, versuchen:

select * 
from table_test 
where last_update_date = to_date('2016-08-02','yyyy-mm-dd'); 

Wenn das nicht funktioniert, dann keine Zeit Probleme zu ignorieren (da standardmäßig die oben genannten Spiele zu 2016- 08-02 @ 12.00.00 only), können Sie das Datum in Frage gestutzt:

select * 
from table_test 
where trunc(last_update_date) = to_date('2016-08-02','yyyy-mm-dd'); 
+1

'trunc (last_update_date)' verhindert, dass ein Index für diese Spalte verwendet wird (außer Sie haben eine Funktion) Basisindex für den abgeschnittenen Wert). Es wird funktionieren, aber es wird weniger effizient sein, als es sein könnte. –

+1

Hallo James, die zweite Abfrage funktioniert eigentlich .. Danke ... –

+0

@learningKid - während die zweite Abfrage funktioniert, achten Sie bitte auf Alex Pooles Kommentar. Gordon zeigte eine "längere" Antwort (mehr tippen), aber er erklärte dasselbe wie Alex - Sie sind besser dran, wenn Sie "trunc()" (den einfachen Ausweg) nicht brauchen, wenn Sie eine effiziente Verarbeitung benötigen. – mathguy

2

Ich würde vorschlagen, dies als zu schreiben:

select * 
from table_test 
where last_update_date >= date '2016-08-02' and 
     last_update_date < date '2016-08-03'; 

Dies setzt voraus, dass last_update_date tatsächlich als Datum gespeichert ist. Beachten Sie, dass der Datentyp date in Oracle auch eine Zeitkomponente enthalten kann, die möglicherweise nicht sichtbar ist, wenn Sie den in einer Abfrage zurückgegebenen Wert betrachten.

Die Verwendung des Schlüsselworts date ermöglicht die Eingabe von Datumsformaten nach ISO-Standard.

Durch die Verwendung von >= und < kann Oracle einen Index für last_update_date verwenden, falls einer verfügbar ist.

+0

Vielen Dank Gordon für Ihre Hilfe :) –