NEWS
Per SQL eine Differenz für bestimmte Zeitspanne
-
Hi zusammen,
gibt es SQL Cracks hier, die mir bitte einen Tipp geben können bezüglich Differenzermittelung in einer bestimmten Zeitspanne?
Stehe total auf dem Schlauch, da mir einfach der Anfang fehlt.
Was habe ich:
-
Ich frage ca. alle 2 Minuten meinen Stromzählerstand per JS ab und das Ganze kommt in eine Variable.
-
Die Variable ist per SQL verbunden, so dass diese Werte dann in meiner MariaDB landen.
-
Ich weiß aber nicht genau, wann die Variable geschrieben wird, das Kann z. B. 20:00:02 Uhr sein, oder aber auch mal 20:00:04 oder ganz anders in dieser Zeit, da ich z. B. gerade einen Reboot hatte.
Nun mein Wunsch:
Ich möchte die Wertedifferenz zwischen 20:00 und 8:00 haben, sprich, was ich in der Nacht verbraucht habe.
Warum per SQL? Naja, somit kann der MySQL Server auch was machen. Den SQL Befehl rufe ich dann per JS auf. Das ist kein Problem. Aber ich finde nicht heraus, wie ich einen Wert nahe 20:00 und 8:00h abfrage und dann auch gleich per SQL berechnen lasse. Das müsste doch aber gehen.
Danke wie immer im Voraus.
So long,
Fitti
-
-
Also an die beiden werte kommst Du per SQL indem du einmal etwas hast wie
Erster Wert: SELECT * FROM table WHERE time>=startzeit order by time LIMIT 1
Letzter Wert: SELECT * FROM table WHERE time<=endzeit order by time desc LIMIT 1
Das könnte man dann im Javascript berechnen. Du hast dann immer den Ersten wert und den letzten Wert in deiner Zeitspanne egal wann genau der Wert geschrieben wurde.
Eine zweite Idee, die aber davon ausgeht das der Wert immer aufsteigend ist, wo dann auch die DB rechnen kann wäre
SELECT MAX(wert)-MIN(wert) from table where time>=startzeit AND time<=endzeit
Das nimmt die Differenz des größten und des kleinsten Wertes im Zeitbereich. Wenn der Wert immer aufsteigend ist müsste genau das rauskommen was Du willst
Ist jetzt beides "trocken" ohne Test runtergeschrieben, aber vllt gibt es ja eine Idee.
Ingo F
-
Danke. Ja logisch. An Limit 1 habe ich gar nicht gedacht.
Ich will einen Klatsch mit Hand an Kopf Smilie….
Ich kann ja auch mit select dann rechnen.
Aber der zweite Vorschlag gefällt mir noch besser. Das ist genau das was ich suchte.
Morgen mal testen.
Also. Danke noch einmal.
Fitti
-
Du kannst es ja direkt in ioBroker machen:
` > function getHistoryRow(date, callback) {
var options = {
start: date,
//end: date,
count: 1,
aggregate: 'none',
ignoreNull: 1
};
sendTo ("sql.1", "getHistory", { id: "<dein_datenpunkt>", options: options }, function(data) {
if (data) {
var rows = [];
rows = rows.concat(data.result);
log(targetId + " ts: " + formatDate(rows[0].ts, "DD.MM.YYYY hh:mm:ss") + " val: " + rows[0].val + " datum: " + rows[0].ts);
}
});
}
// und der Aufruf:
dStunde = formatDate(new Date(), "JJJJ.MM.TT 00:00:00"); // heute um 00:00 Uhr
iStunde = getDateObject(dStunde).getTime() - 86400000; // gestern um 00:00 Uhr
getHistoryRow(iStunde);</dein_datenpunkt> `
Darin kannst wiederum neue Datenpunkte erstellen, usw…Gruß,
a200.