Tipps & Tricks: August 2002 Bereich: DBA, SQL, PL/SQL Erstellung: 08/2002 HA Versionsinfo: getestet mit 10.2 und 11.1 Letzte Überarbeitung: 05/2009 RM Wie kann man ein Datum und eine Zahl ineinander umwandeln? Das Datum wird häufig intern als Zahl behandelt, die der Anzahl an Sekunden ab einem bestimmten Zeitpunkt (z.B. 01.01.1970 0 Uhr) entspricht. Was tun, wenn eine Applikation, die eine solche Form benötigt, auf eine Oracle-Datenbank aufsetzt? Oracle selbst sieht eine solche Umwandlung nicht vor, daher gibt es auch keine vorgefertigte Funktion dafür; intern wird das Datum nicht als Zahl abgespeichert, sondern in sieben Bytes, die, grob gesagt, Jahrhundert, Jahr, Monat, Tag, Stunde, Minute und Sekunde beinhalten. Einzelheiten hierzu finden Sie in der Oracle Doku. Wenn Sie solche Umwandlungen häufiger brauchen, schreiben Sie sich am besten einfache Funktionen, die diese Aufgaben für Sie erledigen. Die Umrechnung von Datum zu Zahl könnte z.B. so aussehen: CREATE OR REPLACE FUNCTION GETSECONDS (p_date IN DATE) RETURN NUMBER IS v_secs NUMBER; v_date DATE; BEGIN v_date := TRUNC(TO_DATE('01.01.1970', 'dd.mm.rrrr')); -- Das Datum Ihrer Wahl v_secs := p_date - v_date; -- Differenz in Tagen v_secs := v_secs * 24 * 60 * 60 ; -- Umrechnung in Sekunden RETURN v_secs ; END; / Umgekehrt erhalten Sie das gewünschte Datum mit folgender Funktion: CREATE OR REPLACE FUNCTION GETDATE (p_secs IN NUMBER) RETURN DATE IS v_date DATE; BEGIN v_date := TRUNC(TO_DATE('01.01.1970', 'dd.mm.rrrr')); -- Das Datum Ihrer Wahl v_date := v_date + p_secs/24/60/60; -- Umrechnumg in Tage -- und Addition RETURN v_date; END; / Der Aufruf kann dann ganz normal aus SQL heraus erfolgen. Um die Uhrzeit mit anzuzeigen, wurde im unteren Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 2 Der Aufruf kann dann ganz normal aus SQL heraus erfolgen. Um die Uhrzeit mit anzuzeigen, wurde im unteren Beispiel noch TO_CHAR ergänzt. Beispiele: SELECT TO_CHAR(getdate(4711), 'dd.mm.rrrr hh24:mi:ss') FROM dual; SELECT getseconds(SYSDATE) FROM dual; Sie können die Umrechnung auch direkt in Ihrem Select vornehmen. Statt eine Funktion aufzurufen, können Sie schreiben: SELECT TO_CHAR( TRUNC( TO_DATE('01.01.1970', 'dd.mm.rrrr') ) + 4711/24/60/60, 'dd.mm.rrrr hh24:mi:ss' ) FROM dual; SELECT (SYSDATE-TRUNC( TO_DATE('01.01.1970', 'dd.mm.rrrr') ) ) * 24 * 60 * 60 FROM dual; Analog dazu können Sie auch die Differenz zwischen zwei Datumsangeben in Sekunden errechnen, entweder über eine Funktion oder direkt im Select-Befehl: CREATE OR REPLACE FUNCTION GETSECONDSBETWEEN (p_from IN DATE, p_to IN DATE) RETURN NUMBER IS v_secs NUMBER; BEGIN v_secs := p_to - p_from; -- Differenz in Tagen v_secs := v_secs * 24 * 60 * 60 ; -- Umrechnung in Sekunden RETURN v_secs ; END; / SELECT getsecondsbetween(hiredate, sysdate) FROM SCOTT.emp; SELECT (SYSDATE - hiredate ) * 24 * 60 * 60 FROM SCOTT.emp; Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 2