perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 25
Click for quality!




10.02.2012 / 21:09

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Rund um das Thema Datenbank zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragSQL Abfrage
Seitenanfang
Hallo,

ich habe eine MySQL Datenbank, inder ich meine Uptime meines PC einspielen lasse. So werden alle 5 minuten Daten in eine Tabelle eingetragen.

So ist die Tabelle aufgebaut:

id pc datum zeit jahr tag std min sek gsek

id: Timestamp (Zeitpunkt des eintrages)
pc: Name des PC's
datum: datum des uptimes
zeit: zeit des uptimes
jahr: uptime jahre
tag: uptime tag
std: uptime std
min: uptime min
sek: uptime sek
gsek: gesamte uptime in sek

Nun zu meinem Problem:
Ich bekomme es nicht hin eine SQL zu erstellen, die mir die (max) uptime anzeigt. Soll heissen: Wenn der PC nach 16 Tagen rebootet werden muss, habe ich einen Eintrag in der Datenbank, der ungefähr so aussieht:

2007-09-07 13:26:00 roma 2007-09-07 13:25:00 0 16 0 27 1 1384021

Nach dem reboot habe ich dann wieder einen Eintrag, der so aussieht:

2007-03-16 18:16:00 roma 2007-03-16 18:15:00 0 0 0 6 18 378

Und wenn der PC mal wieder länger läuft, dann habe ich wieder einen Eintrag.

Das sieht dann ungefähr so aus:
2007-03-16 18:16:00 roma 2007-03-16 18:15:00 0 0 0 6 18 378
2007-03-16 18:21:00 roma 2007-03-16 18:20:00 0 0 0 11 17 677
2007-03-16 18:26:00 roma 2007-03-16 18:25:00 0 0 0 16 17 977
...
...
2007-09-03 06:46:00 roma 2007-09-03 06:45:00 0 11 17 47 2 1014422
2007-09-03 06:51:00 roma 2007-09-03 06:50:00 0 11 17 52 2 1014722
...
...
2007-09-20 01:06:00 roma 2007-09-20 01:05:00 0 0 0 1 1 61
2007-09-20 01:11:00 roma 2007-09-20 01:10:00 0 0 0 5 58 358
...

Natürlich mit viel mehr Daten.

Wie komme ich nun aber jeweils an die maximale laufzeit?

Ich hätte gern, dass das Ergebnis meiner SQL folgendes anzeigt:

2007-02-16 20:11:00 roma 2007-02-16 20:10:00 0 29 0 58 4 2509084
2007-02-17 11:16:00 roma 2007-02-17 11:15:00 0 0 10 10 58 36658
2007-02-18 02:11:00 roma 2007-02-18 02:10:00 0 1 1 5 58 90358
2007-09-03 06:51:00 roma 2007-09-03 06:50:00 0 11 17 52 2 1014722

Also kurz gesagt, er soll mir immer die Daten vor dem letzten reboot anzeigen.

Ich hoffe ich konnte meine Problematik ein wenig darstellen.

Datum: 08.09.2007-03:46

Beitragre: SQL Abfrage
Seitenanfang
Hallo Franco,

ich an deiner Stelle würde erst einmal die Struktur der Datenbank überdenken. Du schreibst im Jahr ca. 105100 Einträge in die DB (365*24*12), von denen du aber warscheinlich nur 12-20 brauchst. Selbst bei einem windows-pc (den du am tag 5*booten musst) würden 1825 Einträge reichen ;-)

Weiterhin schreibst du einige Daten "doppelt" in die DB. Mit dem timestamp in der id hast du doch schon die Informationen Datum und Zeit hinterlegt...

Den Rechnernamen würde ich in einem anderen Table unterbringen und nur seine id speichern.

Wie wäre es mit folgender Struktur:

Table: Daten
boottime (timestamp) (index)
uptime (timestamp)
up_day (int)
up_hour (tinyint)
up_min (tinyint)
up_sek (tinyint)
gsek (float)
rechner_id (tinyint)

Table: Rechner
id (tinyint) (index)
name (tinytext)

Nach jedem reboot wird ein neuer Datensatz in 'Daten' angelegt.
Jetzt brauchst du nur noch alle fünf Minuten die Felder uptime,up_day,up_hour,up_min,up_sek und gsek des lezten Eintrages zu aktualisieren und hast alle relevanten Daten in EINEM Datensatz abgelegt.

Das spart nicht nur Plattenplatz sondern auch Zeit.

Gruß TommyB

PS: Das ablegen von up_day,up_hour,up_min,up_sek und gsek in der DB lohnt sich nur, wenn du zweimal oder öfter innerhalb von 5 Minuten auf die Daten zurückgreifst. Ansonsten würde ich die Berechnung separat durchführen, wenn die Informationen gebraucht werden und die Einträge in der DB weglassen.

Datum: 09.09.2007-19:34

Beitragre: SQL Abfrage
Seitenanfang
Hi TommyB,

einige Datensätze sind Historisch gewachsen, deshalb habe ich es so beibehalten.

Also ich frag die Daten öfters ab, deshalb werden diese alle 5 Minuten abgelegt.

Und die Rechnung 365*24*12 lasse ich nicht von der DB durchführen, sondern von Perl, das passiert alles von vorn herein.

Zudem wird der Rechner ja nicht alle 5 minuten rebootet.

Ich würde aber trotzdem noch wissen, wie man die maximale Zeit vor jedem Reboot nun via SQL lösen könnte.

Datum: 09.09.2007-21:47

Beitragre: SQL Abfrage
Seitenanfang
Hallo,

ich habe meine Datenbank ein wenig umgebaut. Aus dem Timestamp ist nun ein Auto_increment geworden.

Dies hatte zur folge, das ich folgende SQL anwenden konnte:

select * from uptime where id = any (select id-1 from uptime where jahr = 0 and tag = 0 and std = 0 and min BETWEEN '0' AND '5' and gsek <= '280') and gsek > '300'

Diese lieferte auf einer kleinen Tabelle auch die gewünschten Ergebnisse, die ich haben wollte.

Als ich diese SQL dann auf meiner richtigen Tabelle (über 60000 Datensätze) testen wollte, blieb mir immer wieder der PC hängen.

Ich habe die Abfragen einzeln durchgeführt, und die bringen ein Ergebnis.

Sobald aber id = any ins Spiel kommt läuft nichts mehr.

Kann mir jemand sagen wieso? Ich verstehe es nicht, zumal die einzelnen Abfragen funktionieren.

Datum: 18.09.2007-05:27

Beitragre: SQL Abfrage
Seitenanfang
So, das Problem besteht zwar immer noch, aber ich konnte es so lösen, indem ich nun zwei Schritte mache.

Im ersten SQL mach ich folgendes:

my $sql1 = qq{
select id-1 from uptime where jahr = 0 and tag = 0 and std = 0 and min BETWEEN '0' AND '5' and gsek <= '280'
};

damit erhalte ich die ID.

Diese ID gebe ich dann weiter in den zweiten Teil:

my $sql = qq{
select * from uptime where id = $id and gsek > '300'
};

Und somit erhalte ich mein gewünschtes Ergebnis.

Datum: 19.09.2007-10:17

-






-
-