Ich habe so etwas wie SQL:
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 tue, bekomme ich keine Zeilen zurück.
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED = TO_DATE('26/JAN/2011','dd/mon/yyyy')
-> Nahm das Größere als raus
Irgendein Grund warum?
Ja: TIME_CREATED enthält ein Datum und ein hrzeit. Verwenden Sie TRUNC
, um die Zeit zu bestimmen:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
PDATE:
Wie Dave Costa im folgenden Kommentar ausführt, wird Oracle dadurch daran gehindert, den Index der Spalte TIME_CREATED
Zu verwenden, falls vorhanden. Ein alternativer Ansatz ohne dieses Problem ist folgender:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011','dd/mon/yyyy')
AND TIME_CREATED < TO_DATE('26/JAN/2011','dd/mon/yyyy') + 1
Sie können auch Folgendes verwenden, um den TIME-Teil in Ihre Abfrage aufzunehmen:
SELECT EMP_NAME
, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED >= TO_DATE('26/JAN/2011 00:00:00', 'dd/mon/yyyy HH24:MI:SS');
Dies liegt daran, dass eine DATE
-Spalte in Oracle auch einen Zeitteil enthält. Das Ergebnis der Funktion to_date()
ist ein Datum, dessen Uhrzeit auf 00:00:00
Gesetzt ist, und daher stimmt es wahrscheinlich nicht mit Zeilen in der Tabelle überein.
Du solltest benutzen:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE trunc(TIME_CREATED) = TO_DATE('26/JAN/2011','dd/mon/yyyy')
Wie bereits erwähnt, verhindert die Verwendung von TRUNC die Verwendung von Indizes (wenn ein Index für TIME_CREATED vorhanden war). Um dieses Problem zu vermeiden, kann die Abfrage folgendermaßen strukturiert werden
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TIME_CREATED BETWEEN TO_DATE('26/JAN/2011','dd/mon/yyyy')
AND TO_DATE('26/JAN/2011','dd/mon/yyyy') + INTERVAL '86399' second;
86399 ist 1 Sekunde kürzer als die Anzahl der Sekunden pro Tag.
Sie könnten auch tun:
SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'