dani
Goto Top

MySQL - Abfragen gestalten

Guten Abend,

ich stehe vor einer kl. Aufgabe. Und zwar benutzen wir hier TrafMeter Lite. Das Programm protokolliert jede Stunde wie viel Pakete raus und wie viele rein kommen (Netzwerkverkehr auf der Karte) sind. Das Ganze wird in einer MySQL Datenbank gespeichert. Nun sind alle Datensätze wie folgt aufgebaut:
     ts                         sent                      recv  
 610110700           32793740             10359517 

Natürlich sollen die Info's dann schön dargestellt werden per Web-Interface. Das habe ich soweit auch schon fast fertig. Es fehlen halt noch die entsprechende SQL-Statments. Abrufbar soll folgendes sein:

1.) nach Jahre => Sprich ich wähle das Jahr aus und bekomme dann daneben alle Monate mit "Gesendete" und "Empfange"
2.) Dann klickt man auf einen Monat => Alle Datensätze von diesem Moant ansehen.
3.) Dann klickt man auf einen Tag => Alle Datensätze von diesem Tag ansehen.

Aufbau der Felder:

TS
Typ: int(11)
Aufbau: die 6 steht für das Jahr. Die nächsten 2 Stellen ist der Monat. Daruf kommt mit 2 Stellen der Tag, dann die Stunde (auch 2 Stellen) und die restlichen 2 sind die Sekunden.


Wie müssten die einzelen Statments für die 3 Anforderungen aussehen?? Schon mal Danke im vorraus...


Gruß
Dani

Content-Key: 42323

Url: https://administrator.de/contentid/42323

Ausgedruckt am: 28.03.2024 um 18:03 Uhr

Mitglied: 6890
6890 16.10.2006 um 20:07:17 Uhr
Goto Top
hallo,

ich verstehzwar deine frage nicht so richtig aber du könntest die sql funktion substr(ts::text,0,2) für jahr oder substr(ts::text,2,4) für monat oder substr(ts::text,4,6) für tag nutzen.

hoffe ich hab die richtig verstanden.

mfg godlike P
Mitglied: Dani
Dani 16.10.2006 um 20:33:22 Uhr
Goto Top
Also es soll eine TRrafficauswertung gemacht werden. Diese soll dann per PHP verantschaulicht werden.

Wie würde ein Beispiel für 610110700 aussehen, wenn ich den die Stunde ("07") ausgeben lassen möchte. TAbelle heißt t_tml1


Gruß
Dani
Mitglied: 6890
6890 16.10.2006 um 20:41:09 Uhr
Goto Top
select substr(ts::text,5,7) from t_tml

mfg
Mitglied: Biber
Biber 16.10.2006 um 20:44:53 Uhr
Goto Top
...MySql hab ich grad nicht griffbereit, aber in halbwegs "normalen" SQL sollte es so gehen:

SELECT tstabelle.ts, "200" + mid(cstr(ts),1,1) as year,  mid(cstr(ts),2,2) as month,  
 mid(cstr(ts),4,2) as day, 
 mid(cstr(ts),6,2) +":" + mid(cstr(ts),8,2) as hhmm  
FROM tstabelle;
ts year month ~ day hhmm
610172044 2006 10 17 20:44

Gruß
Biber
[Edit]
@Godlike
...bzw:
select * from t_tml where substr(ts::text,5,7) = '07'
and substr(ts::text,3,5) = '17' and substr(ts::text,1,3) = '10' ....;
[/Edit]
[EditEdit] ... where ts = '610110700' !!!! ..
*lach* ..hab ich auch grad gemerkt....
...where ts >= '610110700' and ts <'610110800' ...
[/EditEdit]
Mitglied: 6890
6890 16.10.2006 um 20:50:24 Uhr
Goto Top
[Edit]
@Godlike
...bzw:
select * from t_tml where
substr(ts::text,5,7) = '07';
[/Edit]


@ biber

nein! wenn dann:

select substr(ts::text,5,7) from t_tml where ts = '610110700' !!!!

100% ig

mfg face-wink
Mitglied: Dani
Dani 16.10.2006 um 20:51:45 Uhr
Goto Top
Hi,
schon mal Danke an euch. Leider bringt er n Fehler:
#1305 - FUNCTION trafmeter.cstr does not exist.
Biber: Ich habe dein Statment 1:1 übernommen!


Gruß
Dani
Mitglied: Biber
Biber 16.10.2006 um 20:55:48 Uhr
Goto Top
@Dani

Sorry, dann kennt MySql die cstr()-Funktionalität zwar, wie godLike ja vorgeführt hat, aber nicht die cStr()- Funktion.

Aber die Mimik ist schon die Gleiche... halt auf die jeweils relevanten Stellen des ts-als-String-Wertes vergleichen bzw. abgreifen.

Gruß
Biber
Mitglied: Dani
Dani 16.10.2006 um 21:01:34 Uhr
Goto Top
Hi,
ich steh heut schon den ganzen Tag aufm Schlauch. Was heißt das genau bzw. was muss ich an deinem Beispiel ändern damit es geht?!


Gruß
Dani
Mitglied: Biber
Biber 16.10.2006 um 21:35:04 Uhr
Goto Top
Moin Dani,

so wie godlike P skizziert hat:

Select * from t_tml
... ...where ts >= '610110700' and ts <'610110800'; ... [ alle Sätze vom 11.Okt 06 von 07h bis 07:59:59]

-oder-
... ...where substr(ts::text,0,3 = '610'; ... [ alle Sätze aus dem Oktober 2006]
-oder-

Wenn Du Deine Kriterien so wie oben beschrieben "staffeln" willst, könntest Du bei jeder weiter einschränkenden Auswahl der Anwender eine weitere AND-Bedingung an das Statement dranhängen.

Anfangen mit Jahr:
...where substr(ts::text,0,1 = '6';
-weiter mit Jahr UND Monat:
where substr(ts::text,0,1 = '6' AND substr(ts::text,1,3 = '10';
etc.

Oder verstehe ich jetzt die Frage miss?

Gruß
Biber
Mitglied: Dani
Dani 16.10.2006 um 21:57:58 Uhr
Goto Top
Hi,
ich hab das mal so gemacht:
SQL-Befehl:  
SELECT * FROM tstabelle WHERE substr(ts, 0, 3)= '610';  

MySQL meldet:  
#1305 - FUNCTION trafmeter.substr does not exist 

ts::text habe ich durch "ts" ersetzt. Ist doch so richtig?!


Gruß
Dani
Mitglied: Dani
Dani 17.10.2006 um 17:38:23 Uhr
Goto Top
Hi,
so jetzt geht es. Der Tag heute war schon besser. *gg*
So geht es jetzt:
Select * from tstabelle where substring(ts,1,1)  like '6%'  

Vielen Dank an euch beiden!!

*edit*
So sieht jetzt dein Script aus:
SELECT "2000" + SUBSTRING( ts, 1, 1 ) AS jahr, SUBSTRING( ts, 2, 2 ) AS monat, SUBSTRING( ts, 4, 2 ) AS tag, SUBSTRING( ts, 6, 2 ) + ":" + SUBSTRING( ts, 8, 2 ) AS stunde, recv, sent  
FROM tstabelle
ORDER BY jahr, monat, tag, stunde
LIMIT 0 , 30;
Hab noch ein Denkfehler ausgemacht! Bei 2000 wird die 6 dazugezählt.


Gruß
Dani