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
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 )
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.
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:
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.