Zurück

Date Handling in Oracle

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