Ü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');
|