wake-up-neo.com

Oracle DateTime in der Where-Klausel?

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?

72
sanjeev40084

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
132
Daniel Hilgarth

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');
22
davidsr

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.

4
Basanth Roy

Sie könnten auch tun:

SELECT EMP_NAME, DEPT
FROM EMPLOYEE
WHERE TRUNC(TIME_CREATED) = DATE '2011-01-26'
4