2009-10-15 3 views
27

Ich habe Stunden damit verbracht, im Internet nach einer Antwort auf diese Frage suchen ...Oracle: Wie kann ich NUR Datensätze von gestern auswählen?

Hier ist, was ich derzeit haben:

select * 
from order_header oh 
where tran_date = sysdate-1 

Vielen Dank im Voraus.

+0

Ich bin immer noch Aufzeichnungen aus dem letzten Jahr bekommen, nachdem alle Vorschläge zu versuchen. –

+1

Was ist der 'trans_date'-Spalten-Datentyp? –

+0

Bitte senden Sie einige Beispieldaten und die genaue Abfrage, die Sie ausführen. Da es absolut keine Möglichkeit gibt, dass eine ordnungsgemäß geschriebene Abfrage, die auf SYSDATE-1 beschränkt ist, Zeilen zurückgeben sollte, die SYSDATE-366 entsprechen. – APC

Antwort

58

Verwendung:

AND oh.tran_date BETWEEN TRUNC(SYSDATE - 1) AND TRUNC(SYSDATE) - 1/86400 

Referenz: TRUNC

eine Funktion an den tran_date Rufmittel das Optimierungsprogramm nicht in der Lage sein, einen Index zu verwenden (unter der Annahme eines vorhanden ist) zugeordnet sind damit. Einige Datenbanken, z. B. Oracle, unterstützen funktionsbasierte Indizes, die das Ausführen von Funktionen in den Daten ermöglichen, um die Auswirkungen in solchen Situationen zu minimieren, aber IME-DBAs erlauben dies nicht. Und ich stimme zu - sie sind in diesem Fall nicht wirklich notwendig.

+4

Eine kleine Einschränkung - Sie müssen möglicherweise 1 Sekunde von der oberen Grenze abziehen. Andernfalls, wenn Sie ein TRAN_DATE haben, das heute um Mitternacht ist, wird es in der Abfrage für gestern eingefügte Zeilen zurückgegeben. Ich würde nicht erwarten, dass dies das gewünschte Verhalten ist. –

+1

Berücksichtigen Sie, dass diese Lösung keine Sommerzeit berücksichtigt. Diese Lösung geht davon aus, dass jeder Tag 24 Stunden dauert, bei Tageslicht dauert der Tag 23 Stunden oder 25 Stunden. – sbrbot

10
trunc(tran_date) = trunc(sysdate -1) 
+3

Wenn, wie ich annehme, es einen Index für tran_date gibt, auf den sich diese Abfrage bezieht, wird das Aufrufen einer Funktion für die indizierte Spalte wie dieser die Leistung der Abfrage dezimieren. – ninesided

+0

dann rexem Methode ist hilfreich. –

+1

In diesem Fall können Sie einen funktionsbasierten Index hinzufügen: create index index_name auf table_name (trunc (tran_date)); –

1
to_char(tran_date, 'yyyy-mm-dd') = to_char(sysdate-1, 'yyyy-mm-dd') 
+1

Oracle unterstützt eine große Anzahl von Operatoren direkt an Daten, ohne auf Stringvergleiche zurückgreifen zu müssen. –

1

Wenn Sie zukünftig vom Transaktion dann so etwas wie dies funktionieren könnte nicht unterstützen:

AND oh.tran_date >= trunc(sysdate-1) 
1

Dieser Kommentar ist für Leser, die diesen Eintrag gefunden haben, aber mysql statt Orakel benutzen! auf mysql können Sie wie folgt vorgehen: Heute

SELECT * 
FROM 
WHERE date(tran_date) = CURRENT_DATE() 

Gestern

SELECT * 
FROM yourtable 
WHERE date(tran_date) = DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY) 
+0

Ich bekomme "ORA-00936 fehlenden Ausdruck" am Datum. Siehe http://stackoverflow.com/questions/19143376/ora-00936-when-using-date-function-in-the-oracle-select-statement – NealWalters

Verwandte Themen