Timestamp in Sekunden umwandeln?

Hallo,

also ich habe 2 Timestamps von denen ich aber nur die Differenz in Sekunden gebrauchen kann. gibt es darür irgendeine Funktion in Oracle bzw SQL?

Danke Jochen

Grüß Dich,

ich hab mir mal eine (zugegebener Maßen nicht sehr elegant) Funktion geschrieben, vielleicht hilft die Dir weiter:

Der Aufruf wäre dann im SQL

SELECT zeit_umrechnen(DATUM2-DATUM1)
FROM der_Tabelle_halt;

Funtkion:

FUNCTION ZEIT_UMRECHNEN
( p_ausgangszahl IN Number)
RETURN Varchar IS
v_ausgabe VARCHAR2(200):=’’;
v_rest NUMBER;
v_temp NUMBER;

BEGIN
v_rest := p_ausgangszahl;
IF v_rest IS NULL THEN
v_ausgabe := ‚Kein Wert übergeben‘;
RETURN v_ausgabe;
END IF;
IF v_rest = 366 THEN
v_temp := TRUNC(p_ausgangszahl/365);
IF v_temp = 1 THEN
v_ausgabe := v_temp||’ Jahr ‚;
v_rest := MOD(p_ausgangszahl,365);
v_temp := 0;
ELSE v_ausgabe := v_temp||‘ Jahre ‚;
v_rest := MOD(p_ausgangszahl,365);
v_temp := 0;
END IF;
END IF;
– Tage rechnen
IF v_rest >= 1 THEN
v_temp := TRUNC(v_rest);
v_rest := MOD(v_rest,1);
IF v_temp > 1 THEN
v_ausgabe := v_ausgabe||v_temp||‘ Tage ‚;
ELSE v_ausgabe := v_ausgabe||v_temp||‘ Tag ‚;
END IF;
END IF;
v_temp :=0;
–Stunden rechnen
v_rest := v_rest*24;
IF v_rest >= 1 THEN
v_temp := ROUND(v_rest,0);
v_rest := MOD(v_rest,1);
IF v_temp > 1 THEN
v_ausgabe := v_ausgabe||v_temp||‘ Stunden ‚;
ELSE v_ausgabe := v_ausgabe||v_temp||‘ Stunde ‚;
END IF;
END IF;
–Minuten rechnen
v_temp :=0;
v_rest := v_rest*60;
IF v_rest >= 1 THEN
v_temp := ROUND(v_rest,0);
v_rest := MOD(v_rest,1);
IF v_temp > 1 THEN
v_ausgabe := v_ausgabe||v_temp||‘ Minuten ‚;
ELSE v_ausgabe := v_ausgabe||v_temp||‘ Minute ‚;
END IF;
END IF;
–Sekunden rechnen
v_temp :=0;
v_rest := v_rest*60;
IF v_rest >= 1 THEN
v_temp := ROUND(v_rest,0);
v_rest := MOD(v_rest,1);
IF v_temp > 1 THEN
v_ausgabe := v_ausgabe||v_temp||‘ Sekunden ‚;
ELSE v_ausgabe := v_ausgabe||v_temp||‘ Sekunde ‚;
END IF;
END IF;
v_temp := 0;
v_ausgabe := TRIM(v_ausgabe);
v_temp := INSTR(v_ausgabe,‘ ',-1,2);
IF v_temp != 0 THEN
v_ausgabe := SUBSTR(v_ausgabe,1,v_temp)||‚und ‚||SUBSTR(v_ausgabe,v_temp+1,999)||‘.‘;
END IF;
RETURN v_ausgabe;
–DBMS_OUTPUT.Put_Line(v_ausgabe);
EXCEPTION
WHEN INVALID_NUMBER THEN
DBMS_OUTPUT.Put_Line('v_ausgabe: '||v_ausgabe);
DBMS_OUTPUT.Put_Line('v_rest: '||v_rest);
DBMS_OUTPUT.Put_Line('v_temp: '||v_temp);
RETURN ‚Fehler aufgetreten Inv.Number‘;
WHEN others THEN
DBMS_OUTPUT.Put_Line('v_ausgabe: '||v_ausgabe);
DBMS_OUTPUT.Put_Line('v_rest: '||v_rest);
DBMS_OUTPUT.Put_Line('v_temp: '||v_temp);
DBMS_OUTPUT.Put_Line(SQLCODE);
DBMS_OUTPUT.Put_Line(SQLERRM);
RETURN ‚Fehler aufgetreten Others‘;
END;

Das klingt ein bisserl nach overkill für die Frage.

Es müsste eigentlich auch

(timestamp2 - timestamp1) \* 24 \*60\*60

ausreichen

Grüß Dich,

ich hab mir mal eine (zugegebener Maßen nicht sehr elegant)
Funktion geschrieben, vielleicht hilft die Dir weiter:

– Nicht sehr elegant ist allerding wahr :smile:)

Einfacher : Tabelle mit 2 Timestamp - Attributen :

desc testtimestamp

Describing testtimestamp…

NAME Null? Type


T1 TIMESTAMP (6)
T2 TIMESTAMP (6)

SELECT a.t1- a.t2
FROM testtimestamp a

–> Differenz

– Das ganze funktioniert auch mit Datumswerten

hallo alle zusammen. also den ersten vorschlag habe ich nicht ausprobiert aber die anderen beiden bringen mich nicht weiter. hier mein code erstmal:


create or replace procedure countdown is

zeit1 timestamp(6);
zeit2 timestamp(6);

begin

select systimestamp into zeit1 from dual;

zeit2:= zeit1 + interval ‚100‘ second;

dbms_output.put_line(zeit1);
dbms_output.put_line(zeit2);

dbms_output.put_line(zeit2 - zeit1);

dbms_output.put_line('zeit3: '|| ((zeit2 - zeit1) * 24 *60*60));

end countdown;


als ergebnis bekomme ich dann folgendes:

28.11.06 12:49:28,662109
28.11.06 12:51:08,662109
+000000000 00:01:40.000000000
zeit3: +000000100 00:00:00.000000000

so, ich will aber wenn irgendmöglich nur die secunden, am besten als NUMBER, alles andere bringt mich nicht weiter.

Hai,

ich sehe in der Prozedur nicht wirklich einen direkten Sinn. Vielleicht solltest Du wirklich mal beschreiben, was Du vorhast, zumal man durch deinen Startpost auch nicht wirklich schlauer wird.

  • Willst Du mit den Sekunden rechnen?
  • Willst Du die Sekunden nur im „schönen“ Format ausgeben?
  • Willst Du in SQL oder PL/SQL damit arbeiten?

Dies erleichter wesentlich Dir weiterzuhelfen, ohne alle Begleitumstände erragten zu müssen.

Evtentuell solltest Du wirklich ein Beispiel bringen.

Was mir noch eingefallen ist, wenn Du wirklich NUR mit den Sekunden arbeiten willst, bietet sich auch eine solche Möglichkeit:

–>
SELECT TO_CHAR(SYSDATE,‚ss‘) - TO_CHAR(SYSDATE,‚ss‘)
FROM dual

hallo alle zusammen. also den ersten vorschlag habe ich nicht
ausprobiert aber die anderen beiden bringen mich nicht weiter.
hier mein code erstmal:

  • Sorry jay_r, aber du hast ja dass Ergebniss, sowohl mit meinem Vorschlag als auch mit der Lösung von Jens. Du brauchst die Sache nur noch richtig zu formatieren. Anhand deiner Posting’s hier (und in anderen Foren) würde ich dir empfehlen, mal die Ora Doku zu diesem Thema durchzulesen, dass würde dich eventuell am besten weiterbringen…

Im übrigen Nix für Ungut, Foren sind ja für Fragen da, aber etwas sollte mann schon noch selbst dazu beitragen

–>
SELECT TO_CHAR(SYSDATE,‚ss‘) - TO_CHAR(SYSDATE,‚ss‘)
FROM dual

Kommt immer auf die Fragestellung an… und die ist ja leider nicht klar.