[vz-users] Aggregation (minute) schlägt fehl

Christian Lange brlnr23 at gmail.com
Mo Mär 20 11:29:18 CET 2023


Hi Micha,

ich hab leider keine Ahnung, wie die Datenbank aussieht (ich nutze 
selbst eine andere), aber der Fehler sagt aus, dass eine Division durch 
0 vorliegt.

Die einzige Zeile in der SQL Query, die mir da ins Auge sticht ist diese 
hier:

 > COALESCE( SUM(agg.val_by_time) / (MAX(agg.timestamp) - 
MIN(agg.prev_timestamp)),

Das Maximum des Timestamps minus dem Minimum des vorherigen Timestamps 
aus der (on the fly) erzeugten "agg" Tabelle sind zusammen 0. Daher 
klappt die Division und damit die SQL Query nicht. Die Daten stammen 
(soweit ich das sehen kann) aus der "data" Tabelle. Vielleicht fällt dir 
ja da etwas auf in den Daten bei den Timestamps. Den Rest überlasse ich 
den Experten, die das Tool so im Einsatz haben ;)

Viel Erfolg,
Christian



Am 20.03.2023 um 10:37 schrieb Michael Hartmann:
>
> Hallo,
>
> ich hole das hier noch einmal vor, da es ziemliche nervt.
>
> Via cronjob lasse ich alle 10min eine Aggregation auf die Minute 
> laufen. Bereits vor einigen Wochen ist diese dann plötzlich mit der 
> folgenden Fehlermeldung ausgestiegen:
>
> In AbstractMySQLDriver.php line 128:
>
>   An exception occurred while executing 'REPLACE INTO aggregate 
> (channel_id,
>
>   type, timestamp, value, count) SELECT channel_id, ? AS type, 
> MAX(agg.timest
>
>   amp) AS timestamp, COALESCE( SUM(agg.val_by_time) / 
> (MAX(agg.timestamp) - M
>
> IN(agg.prev_timestamp)), AVG(agg.value)) AS value, COUNT(agg.value) AS 
> coun
>
>   t FROM ( SELECT channel_id, timestamp, value, value * (timestamp - 
> @prev_ti
>
>   mestamp) AS val_by_time, COALESCE(@prev_timestamp, 0) AS 
> prev_timestamp, @p
>
>   rev_timestamp := timestamp FROM data CROSS JOIN (SELECT 
> @prev_timestamp :=
>
> UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(MAX(timestamp) / 1000, "%Y-%m-%d 
> %H:%
>
>   i:00"), INTERVAL 1 minute)) * 1000 FROM aggregate WHERE type = ? AND 
> aggreg
>
>   ate.channel_id = ?) AS vars WHERE channel_id = ? AND timestamp >= 
> IFNULL((S
>
>   ELECT UNIX_TIMESTAMP(DATE_ADD(FROM_UNIXTIME(MAX(timestamp) / 1000, 
> "%Y-%m-%
>
>   d %H:%i:00"), INTERVAL 1 minute)) * 1000 FROM aggregate WHERE type = 
> ? AND
>
> aggregate.channel_id = ? ), 0) AND timestamp < 
> UNIX_TIMESTAMP(DATE_FORMAT(N
>
>   OW(), "%Y-%m-%d %H:%i:00")) * 1000 ) AS agg GROUP BY channel_id, 
> YEAR(FROM_
>
> UNIXTIME(timestamp/1000)), DAYOFYEAR(FROM_UNIXTIME(timestamp/1000)), 
> HOUR(F
>
> ROM_UNIXTIME(timestamp/1000)), MINUTE(FROM_UNIXTIME(timestamp/1000))' with
>
>   params [1, 1, "3", "3", 1, "3"]:
>
>   SQLSTATE[22012]: Division by zero: 1365 Division by 0
>
> In Exception.php line 18:
>
>   SQLSTATE[22012]: Division by zero: 1365 Division by 0
>
> In PDOStatement.php line 117:
>
>   SQLSTATE[22012]: Division by zero: 1365 Division by 0
>
> Die Aggregation auf Stunde und Tag bereitet (bisher) keine Probleme.
>
> Beim letzten Mal hatte ich die Aggregationstabelle gelöscht und neu 
> aufgebaut. Nach einigen Wochen kommt der Fehler nun wieder.
>
> Kann mir jemand erklären wo das Problem liegt? Die Fehlermeldung kann 
> ich nicht interpretieren.
>
> Viele Grüße
>
> Micha
>
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://demo.volkszaehler.org/pipermail/volkszaehler-users/attachments/20230320/fa64f68c/attachment-0001.html>


Mehr Informationen über die Mailingliste volkszaehler-users