Zum Inhalt springen

Zeit / Pingberechnung Oracle + SQL


aL0w

Empfohlene Beiträge

Hallo, ich habe das problem, dass ich nicht weiss wie ich den Ping einer Nachricht die versendet wird errechnen und ausgeben kann.

Mein sql code sieht im moment so aus:

select dsks.dsqu_dsqu_id, dsks.dsks_status,

to_char(dsks.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss')"Datum Zeit Sekunde",

to_char(dsks.dsks_zeitpunkt,'sssss')"Dauer"

from dsks, dsqu

where dsks.dsqu_dsqu_id = dsqu.dsqu_id

and dsks.dsks_status IN ('KP','ZV')

and dsqu.kopa_kopa_id_nachricht_vers = 430

and dsks.dsks_zeitpunkt between to_date('01.01.2007 08:00:00','dd.mm.yyyy hh24:mi:ss')and to_date('05.07.2007 10:00:00','dd.mm.yyyy hh24:mi:ss')

order by dsqu.dsqu_id desc, dsks_status desc;

und liefert diese Tabelle:

DSQU_DSQU_ID DS Datum Zeit Sekunde Dauer

------------ -- ------------------- -----

236680682 ZV 02.01.2007 16:37:11 59831

236680682 KP 02.01.2007 16:37:12 59832

236679499 ZV 02.01.2007 16:29:37 59377

236679499 KP 02.01.2007 16:29:37 59377

236679159 ZV 02.01.2007 16:27:25 59245

236679159 KP 02.01.2007 16:27:25 59245

236678105 ZV 02.01.2007 16:19:58 58798

236678105 KP 02.01.2007 16:19:58 58798

Nun möchte ich, dass ich erstens die Berechnung der Dauer von der ID "KP" - ID "ZV" (Differenz = Ping) bekomme und in eine nächste Spalte ausgebe und dass die Zeit wenns geht in Millisekunden umgerechnet wird (was denke ich nicht so schwer sein sollte).

Danke !

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun möchte ich, dass ich erstens die Berechnung der Dauer von der ID "KP" - ID "ZV" (Differenz = Ping) bekomme und in eine nächste Spalte ausgebe und dass die Zeit wenns geht in Millisekunden umgerechnet wird (was denke ich nicht so schwer sein sollte).

um die differenz zu erhaltren, kannst du entweder die tabelle mit sich selbst joinen oder analytische funktionen verwenden. analytische funktionen sind auf den ersten blick nicht einfach, die oracle doku hat dazu ist aber recht brauchbar.

zur umrechnung: falls du nur sekundengenauigkeit hast, sind millisekunden nicht sehr sinnvoll. date1-date2*86400 ergibt sekunden.

was mich etwas verwundert hat: to_char(datum, 'sssss') hat den alias 'dauer'. 'sssss' gibt doch nur die sekunden ab mitternacht an, willst du das?

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne eigentlich nicht, aber ich hab keine bessere Methode gefunden wie ich den Typ Date in ein Format bekomme wo ich mit rechnen kann...bzw. gibt das mir dann auch gleich Sekunden aus.

Wie funmtioniert das mit dem Join von der selben Tabelle, mache SQL leider erst seit 2 Wochen.

Danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ne eigentlich nicht, aber ich hab keine bessere Methode gefunden wie ich den Typ Date in ein Format bekomme wo ich mit rechnen kann...bzw. gibt das mir dann auch gleich Sekunden aus.

gibt dir aber umständen falsche ergebnisse.

Wie funmtioniert das mit dem Join von der selben Tabelle, mache SQL leider erst seit 2 Wochen.

z.b.:

tabelle TAB (id, status, zahl) mit folgenden werten:

1, 'A', 1

1, 'E', 2

2, 'A', 10

2, 'E', 20

A steht für anfang, E für ende. um die differenz zwischen zwischen A und E für jede id zu ermitteln:

select a.id, b.num-a.num diff

from test a

join test b on a.id = b.id

where a.col='A' and b.col='E';

damit werden die zeilen mit A mit den zeilen mit E über die id verknüpft und somit hat man innerhalb einer zeile zugriff auf die entsprechenden werte für num und kann damit die differenz bilden.

das ergebnis sieht dann so aus:

1, 1

2, 10

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja das sieht schonma plausibel aus, aber das Problem ist, dass ich die Anweisung in die obere Anweisung einbauen muss...weil die werte für "Dauer" erst durch das to_char erstellt werden in einer neuen Spalte. Ich hab den code jetz mal so ca. an mein Problem angepasst, ich denke das haut so ca. hin....aber kein plan obs richtig ist.

select dsks.dsqu_dsqu_id, dsks.dsqu_dsqu.num-dsqu.dsqu_dsqu.num diff

from dsks, dsqu

join dsqu on dsks.dsqu_dsqu_id = dsqu.dsqu_dsqu_id

where dsks.dsks_status in ('KP','ZV');

aber bei der select anweisung müsste ich ja für "num" die werte der "Dauer" (siehen ersten Post) angeben, die aber dort erst erstellt werden????

Seh da net ganz so durch :(

Link zu diesem Kommentar
Auf anderen Seiten teilen

ok, etwas detallierter.

nochmal zurück zu deinem ersten statement:

select dsks.dsqu_dsqu_id, dsks.dsks_status,

to_char(dsks.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss')"Datum Zeit Sekunde",

to_char(dsks.dsks_zeitpunkt,'sssss')"Dauer"

from dsks, dsqu

where dsks.dsqu_dsqu_id = dsqu.dsqu_id

and dsks.dsks_status IN ('KP','ZV')

and dsqu.kopa_kopa_id_nachricht_vers = 430

and dsks.dsks_zeitpunkt between to_date('01.01.2007 08:00:00','dd.mm.yyyy hh24:mi:ss')and to_date('05.07.2007 10:00:00','dd.mm.yyyy hh24:mi:ss')

order by dsqu.dsqu_id desc, dsks_status desc;

dsqu ist erstmal uninteressant, da es nur als filter (kopa_kopa_id_nachricht_vers = 430) und als order-argument fungiert. ebenso wird Dauer weggelassen, da es nicht das ist, was du erreichen wilst. in der where-klausel ist nur disks.dsks_status IN ('KP','ZV') relevant:

select dsks.dsqu_dsqu_id, dsks.dsks_status,

to_char(dsks.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss')"Datum",

from dsks

where dsks.dsks_status IN ('KP','ZV');

das ganze gibt etwas in der art aus:

DSQU_DSQU_ID DS Datum

------------ -- ------------------- -----

236680682 ZV 02.01.2007 16:37:11

236680682 KP 02.01.2007 16:37:12

um jetzt die zeitpunkte der zeilen mit status KP und ZV in eine zeile zu bekommen, werden erst 2 getrennte datensets für alle zeilen mit KP und ZV erstellt:

select dsks_kp.dsqu_dsqu_id, dsks_kp.dsks_status,

to_char(dsks_kp.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss')"Datum_KP"

from dsks disks_kp

where dsks_kp.dsks_status IN ('KP');

select dsks_zv.dsqu_dsqu_id, dsks_zv.dsks_status,

to_char(dsks_zv.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss')"Datum_ZV"

from dsks disks_zv

where dsks_zv.dsks_status IN ('ZV');

und anschliessend über dsqu_dsqu_id miteinander verbunden, :

select dsks_kp.dsqu_dsqu_id,

dsks_kp.dsks_status Status_KP,

dsks_zv.dsks_status Status_ZV,

to_char(dsks_kp.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_KP,

to_char(dsks_zv.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_ZV

from dsks disks_kp

join dsks disks_zv on dsks_kp.dsqu_dsqu_id=dsks_zv.dsqu_dsqu_id,

where dsks_kp.dsks_status IN ('KP')

and dsks_zv.dsks_status IN ('ZV');

das resultset sieht jetzt so aus:

DSQU_DSQU_ID Status_KP Status_ZV Datum_KP Datum_ZV

------------ -- ------------------- -----

236680682 KP ZV 02.01.2007 16:37:12 02.01.2007 16:37:11

jetzt kann die dauer zwischen ZV und KP ermittelt werden:

select dsks_kp.dsqu_dsqu_id,

dsks_kp.dsks_status Status_KP,

dsks_zv.dsks_status Status_ZV,

dsks_kp.dsks_status Status_KP-dsks_zv.dsks_status Status_ZV Dauer,

to_char(dsks_kp.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_KP,

to_char(dsks_zv.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_ZV

from dsks disks_kp

join dsks disks_zv on dsks_kp.dsqu_dsqu_id=dsks_zv.dsqu_dsqu_id,

where dsks_kp.dsks_status IN ('KP')

and dsks_zv.dsks_status IN ('ZV');

in Oracle wird die differenz zwischen zwei dates in tagen (oder bruckteilen davon) angegeben, also einfach mit 86400*1000 multiplizieren, um die differenz in millisekunden zu erhalten:

select dsks_kp.dsqu_dsqu_id,

dsks_kp.dsks_status Status_KP,

dsks_zv.dsks_status Status_ZV,

(dsks_kp.dsks_status-dsks_zv.dsks_status)*86400*1000 Dauer_in_ms,

to_char(dsks_kp.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_KP,

to_char(dsks_zv.dsks_zeitpunkt,'dd.mm.yyyy hh24:mi:ss') Datum_ZV

from dsks disks_kp

join dsks disks_zv on dsks_kp.dsqu_dsqu_id=dsks_zv.dsqu_dsqu_id,

where dsks_kp.dsks_status IN ('KP')

and dsks_zv.dsks_status IN ('ZV');

jetzt noch die anfangs weggelassenen filter- und sortierbedingungen wieder hinzufügen und fertig ist das statement.

-j

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...