tsunami
Goto Top

Mysql Summe von Timediff fehlerhaft

Hallo eine Frage zum Thema mysql.
Gegeben sei eine Tabelle taetigkeiten:
id, startzeit, endzeit, kategorie. Id ist klar, start- und endzeit stehen Daten drin. Also zB
13;2021-11.10 11:15;2021-11.10 11:45;3
Nun möchte ich die Summe der Zeitdifferenzen mit der Kategorie 3 haben.
SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)) as zeit,startzeit,endzeit from taetigkeiten order by startzeit

Also Ergebnis bekomme ich etwas mit 215000 Sekunden. Richtig wären 51300 Sekunden. Das Kuriose ist, wenn ich dasselbe ohne Summ mache:
SELECT TIMESTAMPDIFF(SECOND,startzeit,endzeit) as zeit,startzeit,endzeit from taetigkeiten where kategorie_id=3 order by startzeit

wirft er mit die korrekten Sekunden raus. Im obrigen Beispiel halt 1800. Anderer Versuch:
select SEC_TO_TIME(SUM(UNIX_TIMESTAMP(endzeit) - UNIX_TIMESTAMP(startzeit)))
  from taetigkeiten where kategorie_id=3

Selber Fehler. Die Felder sind halt id=pk, taetigkeit_id=int, start- und endzeit datetime. Ich möchte halt Zeiten erfassen und die Differenzen als Summen ausgeben.
Also Kategorie 3: 12 h 45 Minuten, Kategorie 1: 124 h 15 Minuten usw.

Wo ist der Fehler? Was mich irritiert, die einzelnen Werte sind korrekt. Die Summe nicht? Ich kann es natürlich in php lösen, in der Schleife und dann per Arrays.
Aber es muss doch möglich sein in mysql zu rechnen...
Any idea
tsunami

Content-ID: 1466300952

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

Ausgedruckt am: 24.11.2024 um 05:11 Uhr

erikro
erikro 04.11.2021 um 17:22:42 Uhr
Goto Top
Moin,

was genau willst Du tun? Willst Du alle Zeiten, die für die Tätigkeit verbraucht wurden, aufsummieren (Aggregatfunktion sum()) oder willst Du für jeden einzelnen Datensatz in einem Feld die Differenz ausgeben?

Liebe Grüße

Erik
stefaan
stefaan 04.11.2021 um 17:24:01 Uhr
Goto Top
Servus,

welchen Datentyp hast du für die Datumsspalten?
"2021-11.10 11:15" schaut eigenartig aus.

Grüße, Stefan
tsunami
tsunami 04.11.2021 um 17:34:24 Uhr
Goto Top
@erik: Alle Tätigkeiten also Summe Fahrtzeiten, Summe, Büro, Summe Kunden usw.
@stefaan Tippfehler datetime. natürlich 2021-11-10 11:15

Die Korrekte Summe wäre 51300 Sekunden. Rauswerfen tut er mir 252000.
Einzeln ohne Sum:
900
3600
3600
1800
1800
1800
900
3600
3600
1800
1800
1800
900
1800
1800
1800
1800
900
3600
3600
1800
1800
1800
900
1800
tsunami
tsunami 04.11.2021 aktualisiert um 18:04:17 Uhr
Goto Top
Hm, ich habe eine Idee:
Wenn ich nur select sum(unix_timestamp(startzeit) eingebe, bekomme ich 167390703900 Und das bei gut 100 Werten.
Kann es sein, dass es sowas wie einen Überlauf gibt? Also einfach Zahlen zu groß? Ich habe erstmal nur einen Mitarbeiter und 1 Monat.
Das sind ja letztendlich rund Startzeiten pro Tag und 5 Endzeiten. Also was weiß ich Fahrzeit, Kunde, Pause, Fahrzeit, Büro.
Also Tag1: Anfahrt 08:15-08:30 Fahrt. 08:30 -12:00 Kunde, 12:00 - 12:30 Pause, 12:30-16:30 Kunde, 16:30-17:00 Fahrzeit.
Dann habe ich 45 Minuten Fahrzeit, 7,5 h Kunde, 0:30 Pause.

Summiere ich nun pro Tag 45 Minuten Fahrzeit pro Tag * 30 * 60 Sekunden wären es ~ 81000 Sekunden
erikro
erikro 04.11.2021 um 17:58:30 Uhr
Goto Top
Zitat von @tsunami:

@erik: Alle Tätigkeiten also Summe Fahrtzeiten, Summe, Büro, Summe Kunden usw.

Dann fehlt da was:

SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)) as zeit,startzeit,endzeit from taetigkeiten order by startzeit

Das ist das, was Du hast. Da sagst Du ihm, er soll in jedem Datensatz alle Differenzen der Zeiten aufsummieren. Das gibt dann das viel zu große Ergebnis.

SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)), kategorie_id from taetigkeiten group by kategorie_id

sollte das richtige Ergebnis liefern. Siehe: https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html

Die Felder Start- und Endzeit kannst Du Dir dabei nicht ausgeben lassen, da die mehrdeutig sind und dann das group by nicht funktioniert.

hth

Erik
tsunami
tsunami 04.11.2021 um 18:10:29 Uhr
Goto Top
@erik Leider ein Satz mit x. Hinterher muss da ein group by rein, klar. Dann habe ich Fahrzeit, Kunde, Pause usw.
Zum Eingrenzen habe ich daher das
where kategorie_id=3
reingenommen.
Damit er erstmal nur die Fahrzeiten rauswirft.

Ausgabe vom group by:
675000
252000 <- hier sollte 51300 stehen
23400
112500
erikro
erikro 04.11.2021 aktualisiert um 18:21:50 Uhr
Goto Top
Zitat von @tsunami:

@erik Leider ein Satz mit x. Hinterher muss da ein group by rein, klar. Dann habe ich Fahrzeit, Kunde, Pause usw.
Zum Eingrenzen habe ich daher das
where kategorie_id=3
reingenommen.
Damit er erstmal nur die Fahrzeiten rauswirft.

Ausgabe vom group by:
> 675000
> 252000 <- hier sollte 51300 stehen
> 23400
> 112500

Ich habe nicht wirklich verstanden, was Du jetzt probiert hast mit group by. Kannst Du mal die Statements komplett posten? <edit>Und ist nur der eine Wert falsch oder alle?</edit>
tsunami
tsunami 04.11.2021 um 18:22:10 Uhr
Goto Top
SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)) from taetigkeiten where kategorie_id=3
erikro
erikro 04.11.2021 um 18:25:23 Uhr
Goto Top
Zitat von @tsunami:

SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)) from taetigkeiten where kategorie_id=3

Und wo ist da das group by?
tsunami
tsunami 04.11.2021 um 18:28:29 Uhr
Goto Top
Testweise Kunden genommen: korrekte Summe 158400, falsches msqlErgebnis 675000
tsunami
tsunami 04.11.2021 um 18:35:19 Uhr
Goto Top
Das group by wollte ich im zweiten Schritt einbauen. Erstmal soll er nur die Sume der Fahrzeiten ausspucken (kategorie3). Danach dann natürlich so wie von Dir gepostet mit group by kategorie_id
So dass ich rausbekommen:
Kategorie 1: 12345 Sekunden
Kategorie 2: 34553531Sekunden
Katergorie 3: 3551 Sekunden

Aber auch das group by liefert falsche Werte. Zwischendurch dachte ich auch, dass man xampp zu alt ist, ne Macke hat oder sonstwas. Andere Instanz bei Allinkl genommen. Der Fehler bleibt.
tsunami
tsunami 04.11.2021 um 18:40:29 Uhr
Goto Top
SELECT sum(taetigkeiten.endzeit-taetigkeiten.startzeit) as dauer,kategorien.name,taetigkeit_id,farbe from taetigkeiten,kategorien where taetigkeit_id=kategorien.id group by taetigkeit_id
Noch ein versuch. Liefert wieder andere Werte
tsunami
tsunami 04.11.2021 um 18:41:56 Uhr
Goto Top
Was mich massiv irritiert, ist, dass die Funktion ohne sum und group by, die korrekten Werte liefert.
erikro
Lösung erikro 04.11.2021 um 18:59:09 Uhr
Goto Top
Hast Du mal das ganz einfache Select-Statement von mir probiert?
SELECT sum(TIMESTAMPDIFF(SECOND,startzeit,endzeit)), kategorie_id from taetigkeiten group by kategorie_id
Was kommt da raus?
tsunami
tsunami 04.11.2021 um 19:04:48 Uhr
Goto Top
        675000 	1
	252000 	3
	23400 	4
	112500 	5
Kategorie 1 und 3 sind falsch. Bei 1 müsste 158400 stehen und bei 3 51300. Wenn ich mir die einzelnen Werte, also ohne Sum und ohne group by rauswerfen lasse. Sind die korrekt.
Block1: 15 Minuten -> 900 s
Block2: 60 Minuten -> 300 s
usw.
Summiere ich die Excel kommt halt 51300 raus. Habe auch grob überschlagen. Das passt. Aber keinesfalls 252000.
tsunami
tsunami 04.11.2021 um 19:36:55 Uhr
Goto Top
Arg, ich mags nicht sagen. Man sollte früher Feierabend machen. Alles richtig. Der Fehler waren zu viele Datensätze.
phpmyadmin hat halt nur die ersten 25 angezeigt. Es waren aber 107... Die 25 hatte ich kopiert und nachgerechnet.
Wenn ich alle 107 nehme passt. War schon am zweifeln... face-smile

Vielen Dank für die Hilfe!
erikro
erikro 04.11.2021 um 21:16:27 Uhr
Goto Top
🤣🤣🤣 Das kenne ich. Schönen Feierabend.
akretschmer
akretschmer 05.11.2021 um 09:01:13 Uhr
Goto Top
hier treten 2 Probleme auf:

  • logischer Abfragefehler: Aggregation ohne Gruppierung der nicht-aggregierten Spalten
  • massiver Bug in MySQL, dies nicht zu erkennen

MySQL liefert hier ein Zufallswert aus, keinen Fehler - wie es richtig wäre. Schrottsoftware.