|
Übersicht
Die Behandlung von Datums-Abfragen kann in Oracle sehr verwirrend sein wie das folgende
Beispiel zeigt. Man muss sich bewusst sein, dass Oracle DATE Datentypen als NUMBERS
intern speichert. Insbesondere kann die "hidden precision" in Queries zu ungewollten
Fehlern führen.
Beispiel
-
Man kreiere folgende Tabelle
create table test_dates (
the_value varchar(20),
the_date date
);
-
Man fülle sie mit folgenden Werten
insert into test_dates values ('happy',sysdate);
insert into test_dates values ('happy',sysdate);
insert into test_dates values ('joy',sysdate);
insert into test_dates values ('joy',sysdate);
commit;
-
Query mit Berücksichtigung der Precision
select * from test_dates where the_date = sysdate;
no rows selected
-
Query ohne Berücksichtigung der Precision
(trunc)
select * from test_dates where trunc(the_date) = trunc(sysdate);
THE_VALUE
THE_DATE
-------------------- ---------
happy
17-MAY-99
happy
17-MAY-99
joy
17-MAY-99
joy
17-MAY-99
Fazit
Bei Datumsabfragen muss immer die Precision berücksichtigt werden, da Oracle DATES
als NUMBERS speichert. Mittels TRUNC(datum) wird die Precision "abgeschnitten" --
deshalb immer TRUNC verwenden oder explizit eine Formatmask benutzen:
select * from test_dates
where to_char(the_date,'YYYY-MM-DD') = to_char(sysdate,'YYYY-MM-DD');
|