2010-03-08 4 views
37

Ich versuche Datensätze aus der Tabelle abzurufen, da das Datum in der Spalte Datum und Uhrzeit enthält.Wählen Sie aus der Tabelle, indem Sie nur das Datum ohne Zeit kennen (ORACLE)

Angenommen, ich habe eine Tabelle namens t1, die nur zwei Spalten name bzw. date enthält.

Die Daten in Spalte Datum wie diese gespeichert 8/3/2010 12:34:20 PM.

Ich möchte von dieser Abfrage zum Beispiel diesen Datensatz abzurufen (beachten Sie, ich habe nicht die Zeit setzen):

Select * From t1 Where date="8/3/2010" 

Diese Abfrage mir nichts geben!

Wie kann ich date abrufen, indem ich nur date ohne die Zeit weiß?

Antwort

68

DATE ist ein reserviertes Schlüsselwort in Oracle, also verwende ich stattdessen den Spaltennamen .

Wenn Sie einen Index auf your_date haben, würde ich

WHERE your_date >= TO_DATE('2010-08-03', 'YYYY-MM-DD') 
    AND your_date < TO_DATE('2010-08-04', 'YYYY-MM-DD') 

oder BETWEEN verwenden:

WHERE your_date BETWEEN TO_DATE('2010-08-03', 'YYYY-MM-DD') 
        AND TO_DATE('2010-08-03 23:59:59', 'YYYY-MM-DD HH24:MI:SS') 

Wenn kein Index ist oder wenn es nicht zu viele Datensätze

WHERE TRUNC(your_date) = TO_DATE('2010-08-03', 'YYYY-MM-DD') 

sollte ausreichen. TRUNC ohne Parameter entfernt Stunden, Minuten und Sekunden von einer DATE.


Wenn Leistung wirklich zählt, sollten Sie für diese Spalte eine Function Based Index setzen:

CREATE INDEX trunc_date_idx ON t1(TRUNC(your_date)); 
+0

Problem gelöst Danke Jungs – Abdulrhman

+0

@Abdulrhman - Sie sollten die Antwort akzeptieren, die für Sie gearbeitet hat! – Leslie

+0

Trunc() arbeitete für mich! Vielen Dank! –

2

Sie könnten die zwischen Funktion verwenden, um alle Datensätze zwischen 2010-08-03 00 zu erhalten: 00: 00: 000 UND 2010-08-03 23: 59: 59: 000

+3

'BETWEEN' bedeutet '> = AND <=', also würde Ihre Abfrage auch Zeilen mit 'date = 2010-08-04 00: 00: 00' zurückgeben. –

+0

Guter Fang, behoben. Ihre Antwort war viel gründlicher +1. –

+1

+1 jetzt ist es behoben, da Ihre Antwort auch korrekt ist :) –

0

Versuchen Sie, die folgende Art und Weise.

Select * from t1 where date(col_name)="8/3/2010" 
+2

Sorry, aber das funktioniert nicht mit Oracle. Gibt mir einen 'ORA-00936: fehlender Ausdruck'. –

+0

In Oracle werden doppelte Anführungszeichen zur Begrenzung eines Bezeichners verwendet. Einfache Anführungszeichen werden für Zeichenfolgenliterale verwendet. –

+1

Funktioniert nicht .. – codewarrior

3

persönlich in der Regel gehe ich mit:

select * 
from t1 
where date between trunc(:somedate)   -- 00:00:00 
      and  trunc(:somedate) + .99999 -- 23:59:59 
+1

1/86400 ist eine magische Zahl, die alle Oracle-Typen kennen sollten. –

2

Konvertieren Sie Ihre Datumsspalte in das richtige Format und vergleichen:

SELECT * From my_table WHERE to_char(my_table.my_date_col,'MM/dd/yyyy') = '8/3/2010' 

Dieser Teil

to_char(my_table.my_date_col,'MM/dd/yyyy') 

Ergebnis in Zeichenfolge '03.08.2010'

0

trunc(my_date,'DD') gibt Ihnen nur das Datum und nicht die Zeit in Oracle.

Verwandte Themen