[C] Frage zu Vergleichsfunktion

Buba235

Erfahrenes Mitglied
Hallo!

Hab schon wieder eine Frage (kaum ist die eine beantwortet). Nur dieses Mal geht es nicht um SQL-Befehle (zumindest nicht komplett). Ich hab da ein Problem in C. Ich weiß nicht wie ich das eine mit dem anderen verbinden kann. Also ich hab da eine SQL-Tabelle die so aufgebaut ist:

Code:
ID   |   TYPE   |   DATE   |   TIME   |   PACKET_ID   |   SRC_IP   |   DST_IP   |   ID_LINK
1    |   Rec    |   01.01  |   11:00  |     255       |  0.0.0.1   |   1.0.0.0  |      1    
2    |   Resp   |   01.01  |   11:02  |     255       |  1.0.0.0   |   0.0.0.1  |      1
3
...

Das also mal zum Verständnis. Was ich jetzt machen möchte ist, ich will innerhalb eines bestimmten Zeitraums (max. 5 Minuten bei Spalte TIME) den zu einem (im TYPE) gehörenden Resp zu dem Rec finden und dann in ID_LINK die gleiche ID-Nummer eintragen wie die Nummer bei Rec. Mein Problem ist der Punkt mit der Zeit. Wie kann ich denn sagen dass nur in einem Zeitraum von so ca. 5 Minuten gesucht und verglichen wird? Bei dem Feld TIME sind auch Sekunden vorhanden. Wie das mit dem SQL-Befehl geht, damit ich den ID_LINK eintragen kann, weiß ich (denke ich zumindest). Nur wie kann ich in einfachem C das mit der Zeit machen?
 
Hallo!

Ich denke ich hab es herausgefunden. Ich schreib die Zeiten einfach in eine Datei und vergleiche diese dann mit meinem Zeitraum. Nur weiß ich jetzt nicht wie ich das ganze dann mit der DB in Verbindung bringen soll.
 
Hi.

Daten und Zeiten zu vergleichen ist ja nicht immer ganz einfach. Um festzustellen ob ein Eintrag in einem Intervall von 5 min. ab der Uhrzeit eines anderen Eintrages liegt mußt du z.B. auch das Datum in Betracht ziehen, denn die 5 min. können ja auch über eine Tagesgrenze hinweggehen.

Wenn das Datum gleich ist, ist es ja relativ einfach: einfach jeweils die Stunden (ist das eigentlich in 24-Stunden Format gespeichert?) mit 60 multiplizieren, die Minuten addieren und dann die Differenz der Einträge bilden.

Wenn das Datum nicht gleich ist, mußt du erstmal schauen ob das Datum größer ist und dann vergleichen.

Andererseits bietet MySQL aber auch einen DATETIME Datentyp und dazugehörigen Funktionen mit denen man sowas auch relativ einfach berechnen kann. Schau mal hier http://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html

Gruß
 
Hallo!


Bin euch dankbar für euere Antworten, aber leider kann ich nichts damit anfangen. Ich bin einfach zu wenig in der Materie :( . Also ich versuch mal zu rekapitulieren:

Code:
SELECT * WHERE TYPE = 'Rec', ID, PACKET_ID AND WHERE SOURCE_IP = DST_IP 
DATEDIFF(TIME - TIME)

Mir ist klar dass das so nicht geht. Es war nur als Beispiel gedacht. Aber so nach dem "Muster" sollte der Befehl ablaufen. Danach soll ja die ID in ID_Link eingetragen werden. Und zwar bei beiden (sowohl Rec als auch Resp). Aber wie geht es genau? :confused:
Mir ist klar, dass ich praktisch eine Lösung fordere, aber ich komm nicht weiter. Bitte also um Hilfe!


Gruß
 
Hallo,

wenn du dein date als datetime Typ abspeicherst kann man das auch in einem
SQL Query erschlagen:

Table1:
Code:
mysql> select * from table1;
+------+------+---------------------+-----------+-------------+---------+---------+
| id   | type | date                | packet_id | src_ip      | dst_ip  | id_link |
+------+------+---------------------+-----------+-------------+---------+---------+
|    1 | Rec  | 2006-01-01 11:00:00 |       255 | 0.0.0.1     | 1.0.0.0 |    NULL |
|    2 | Resp | 2006-01-01 11:02:00 |       255 | 1.0.0.0     | 0.0.0.1 |    NULL |
|    3 | Resp | 2006-01-02 11:02:00 |       255 | 1.0.0.0     | 0.0.0.1 |    NULL |
|    4 | Resp | 2006-01-01 11:06:00 |       255 | 1.0.0.0     | 0.0.0.1 |    NULL |
|    5 | Resp | 2006-01-01 11:02:00 |       255 | 192.168.0.1 | 0.0.0.1 |    NULL |
+------+------+---------------------+-----------+-------------+---------+---------+
5 rows in set (0.00 sec)

Folgendes Query:
SQL:
select
    t2.id
    from table1, (select date,id from table1 where src_ip in (select dst_ip from table1 where id=1)) as t2
        where table1.id = 1 and abs(unix_timestamp(table1.date) - unix_timestamp(t2.date)) < 300;

bringt dann folgendes Result:

Code:
+------+
| id   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

Gruß,

RedWing
 
Hallo!

Erst mal danke für diesen Befehl! Sowas hab ich noch nie gesehen. Recht imposant! Aber jetzt mal zu einigen Verständnisfragen: Was ist den "t2" und was ist "abs"? Ich versteh nicht wo das herkommt, bzw. was das machen soll!
Leider hab ich 2 Spalten für Date und Time. Also so kann ich es leider nicht schreiben (denke ich zumindest). Aber Date und Time werden bei mir in dieser Formatierung gespeichert (nur eben in 2 Spalten).
 
Hallo,

kannst du deine Tabellenstruktur nicht aendern? Noch guenstiger waere vielleicht
das Datum gleich als Timestamp(int) in der DB zu speichern, das erspart dir
das Konvertieren in einen unix_timestamp und macht dir denke auch so
das Leben um einiges leichter...


t2 ist ein neuer temporaerer Name fuer die Resultattabelle aus
SQL:
(SELECT date,id FROM table1 WHERE src_ip IN (SELECT dst_ip FROM table1 WHERE id=1))

den muss ich vergeben um diese Resultattabelle dann im join ansprechen zu
koennen...

abs() ist einfach die SQL Funktion um den Betrag einer Zahl auszurechnen...
//edit das abs kann man auch weglassen wenn man die beiden Tabellen in der Subtraktion vertauscht...

Gruß,

RedWing
 
Zuletzt bearbeitet:
Achso ist das mit dem t2.
Also ich hab mir meine Tabelle nochmal angesehen und es gibt so eine Spalte (sie heißt auch TIMESTAMP). Da steht genau das drin was bei dir drin steht und das was du eben meinst.
Wie muss dann der Befehl aussehen, wenn ich also diesen TIMESTAMP hab?
 
Also ich hab mal das hier gemacht:

Code:
SELECT t2.PACKET_ID FROM tabelle, (SELECT TIMESTAMP, PACKEST_ID 
FROM tabelle WHERE SRC_IP IN (SELECT DST_IP FROM tabelle WHERE PACKET_ID))
AS t2 WHERE tabelle.PACKET_ID = PACKET_ID AND 
abs(unix_timestamp(tabelle.TIMESTAMP) - unix_timestamp(t2.TIMESTAMP)) < 300;

Das Problem ist nur, so gehts nicht, weil da kommt der Fehler dass "PACKET_ID im WHERE Clause zweideutig" wäre. Klar auch, weil ich ja keine PACKET_ID angebe. Das kann ich aber auch nicht. Ich muss nur überprüfen, wo die PACKET_ID gleich ist und die SRC_IP vertauscht mit der DST_IP ist. Das am besten innerhalb der 5 Minuten!
 
Zurück