aL0w Geschrieben 17. Juli 2007 Teilen Geschrieben 17. Juli 2007 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 ! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 17. Juli 2007 Teilen Geschrieben 17. Juli 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
aL0w Geschrieben 18. Juli 2007 Autor Teilen Geschrieben 18. Juli 2007 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 18. Juli 2007 Teilen Geschrieben 18. Juli 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
aL0w Geschrieben 19. Juli 2007 Autor Teilen Geschrieben 19. Juli 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jasper Geschrieben 22. Juli 2007 Teilen Geschrieben 22. Juli 2007 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.