Ich habe SQL so etwas:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Dies gibt 10 Zeilen zurück und TIME_CREATED = '26 -JAN-2011 '
Wenn ich das mache, bekomme ich keine Zeilen zurück,
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Hat das Größere als rausgenommen
Irgendein Grund warum?
sql
oracle
time
date-arithmetic
sanjeev40084
quelle
quelle
01
anstelle vonJAN
(und natürlich das entsprechende Format) verwenden, um sicherzustellen, dass Ihr Code auf jedem System problemlos ausgeführt wird.Antworten:
Ja: TIME_CREATED enthält ein Datum und eine Uhrzeit . Verwenden Sie
TRUNC
, um die Zeit zu entfernen:UPDATE:
Wie Dave Costa im folgenden Kommentar ausführt, verhindert dies, dass Oracle den Index der Spalte verwendet,
TIME_CREATED
falls vorhanden. Ein alternativer Ansatz ohne dieses Problem ist folgender:quelle
BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy') AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
?between
wegen der Mehrdeutigkeit. Es klingt so, als ob es ausschließlich die Grenzen ist, obwohl es tatsächlich inklusive ist. Deshalb vermeide ich es. Darüber hinaus wäre es in diesem konkreten Beispiel nicht dasselbe.Sie können auch Folgendes verwenden, um den TIME-Teil in Ihre Abfrage aufzunehmen:
quelle
Dies liegt daran, dass eine
DATE
Spalte in Oracle auch einen Zeitteil enthält. Das Ergebnis derto_date()
Funktion ist ein Datum, auf das die Uhrzeit eingestellt ist,00:00:00
und daher stimmt es wahrscheinlich nicht mit den Zeilen in der Tabelle überein.Du solltest benutzen:
quelle
Sie könnten auch tun:
quelle
Wie bereits erwähnt, verhindert die Verwendung von TRUNC die Verwendung von Indizes (wenn für TIME_CREATED ein Index vorhanden war). Um dieses Problem zu vermeiden, kann die Abfrage wie folgt strukturiert werden
86399 ist 1 Sekunde weniger als die Anzahl der Sekunden an einem Tag.
quelle