Als PDF Downloaden!

Werbung
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
Herunterladen