7516463Medlem sedan dec. 201349 inlägg Hej.
Min php+mysql kunskap är lite begränsad.
Jag har en databas som samlar ihop data i kwh varje 2 minuter. Jag skulle vilja ha en kod i php där man kan räkna ihop datan under en viss period. t.ex Förbrukning under 1 vecka, 2 veckor... 1 månad, 2 månader...1 år osv...
tack på förhand.
7516463Medlem sedan dec. 201349 inlägg Lite mer förklaring:
Jag har en kolumn med namnet:DATETIME med datum i format: 2014-05-18 13:42:36
Sedan är kolumnen "Kwh" där värden från sensorn läggs in t.ex 0,02
Det jag vill ha ut är t.ex summan av värden från "kwh" mellan t.ex datum 2014-05-01 00:00:00 och 2014-05-07 00:00:00 för att få reda på förbrukningen den senaste veckan...
metalboyMedlem sedan jan. 2005953 inlägg Använd SUM() för att få fram summan.
SELECT SUM(Kwh) FROM tabell WHERE `datetime` BETWEEN '2014-05-01 00:00:00' AND '2014-05-07 00:00:00'
Notera att du måste använda backticks (`) runt datetime om det är kolumnnamnet för datumkolumnen, eftersom datetime är ett reserverat ord i MySQL.
7516463Medlem sedan dec. 201349 inlägg Tack. Om man vill använda antalet rader istället? Ska jag använda row istället för datetime och sedan ange antalet rader istället för datum?
metalboyMedlem sedan jan. 2005953 inlägg Nu vet jag inte om jag förstår riktigt. Vill du ha summan av till exempel de 10 senaste raderna? Använd LIMIT för att begränsa antalet rader i resultatet. Till exempel så här:
SELECT SUM(Kwh) FROM tabell ORDER BY id DESC LIMIT 10
7516463Medlem sedan dec. 201349 inlägg Jo du förstod nog rätt...ska fixa det i kväll och se om jag får det atgt fungera
7516463Medlem sedan dec. 201349 inlägg så här ser min kod ut nu...
<?php
$opendb = mysql_connect("******", "******", "*******")
or die("Kunde inte ansluta till MySQL:<br />" . mysql_error());
mysql_select_db("logtemp")
or die("Kunde inte ansluta till databasen:<br />" . mysql_error());
$query = "SELECT SUM(B10000000D076C1D) FROM logtemp ORDER BY DATETIME DESC LIMIT 5;";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
echo round ($row['SUM(B10000000D076C1D)'],2);
echo "<br />";
}
?>
Dock så räknar den i hop hela kolumnen även fast jag anger att den bara ska räkna de sista 5 raderna. Vad har jag gjort fel?
DATETIME är en kolumn i databasen jag har även provat att skriva `datetime` men det är samma sak där, den räknar ihop hela databasen.
metalboyMedlem sedan jan. 2005953 inlägg Hmm... testade lite själv nu, och det verkar som att du behöver göra en subselect för att slippa summera hela tabellen. Helknasigt tycker jag, men men :)
SELECT SUM(B10000000D076C1D) AS summa FROM (SELECT B10000000D076C1D FROM logtemp ORDER BY `datetime` DESC LIMIT 5) AS s
7516463Medlem sedan dec. 201349 inlägg Då gnäller den att raden:
echo round ($row['SUM(B10000000D076C1D)'],2);
inte är correct
metalboyMedlem sedan jan. 2005953 inlägg Det är för att jag satte ett alias "summa" på det. Använd detta
echo round (row['summa'], 2);
eller ta bort AS summa från SQL-frågan.
7516463Medlem sedan dec. 201349 inlägg Tack så mycket... nu är det precis som jag vill ha det... nu ska bara tidsramarna in så är allt klart.
Återigen Tack!
7516463Medlem sedan dec. 201349 inlägg Programmet Logtemp lägger in data varannan minut. I slutet av varje heltimme nollställer den räkneverket och börjar om igen.
Databasen ser ut så här:
DATETIME B10000000D076C1D id
2014-05-26 12:01:01 0.02 1
2014-05-26 12:03:02 0.04 2
2014-05-26 12:05:04 0.06 3
2014-05-26 12:07:01 0.08 4
2014-05-26 12:09:03 0.10 5
2014-05-26 12:11:01 0.12 6
2014-05-26 12:13:02 0.14 7
2014-05-26 12:15:04 0.20 8
2014-05-26 12:17:01 0.22 9
2014-05-26 12:19:03 0.30 10
...
2014-05-26 12:55:04 0.40 29
2014-05-26 12:57:01 0.42 30
2014-05-26 12:59:03 0.50 31
Jag vill kort och gott få ut aktuell förbrukning...alltså den sista xx:59 raden, för de senaste 2h, 6h,12h,24h...osv. hur ska jag göra detta? har suttit och försökt men får inte till det.
HJÄLP!
rhdfMedlem sedan okt. 2007446 inlägg Hmm om databasen ser ut sådär så är det ju en sak som slår mig.
Loggar den verkligen aktuell förbrukning? Det är inte total förbrukning den lägger in? Så för att få "minutvärden" (eg varannan minut) så får du ta en post minus föregående.
Med SUM kommer du ju i så fall inte få förbrukningen utan en summa av totaler.
En dataserie som ser ut exempelvis
0.1, 0.2, 0.3, dvs 0.1 ökning/steg skall ju resultera i 0.3, inte 0.6
7516463Medlem sedan dec. 201349 inlägg Nä förbrukningen är ju inte konstant utan ökar lite olika beroende på förbrukningen.
Men det jag vill få ut är är hur man plockar ut de poster som är varje xx:59:xx för att sedan kunna summera som, men eftersom det är sekunder med ock databasen uppdateras inte exakt varje helsekunder alltså 12:00:00 utan det är någon sekunder som alltid skiljer sig åt.
Hur gör jag det? alltså antingen att kunna plocka ut raderna som 12:59 bara och inte 12:50:02 även fast sekunderna är med i databasen.
Och hur skriver jag för att plocka ut enstaka rader och summera dom.
7516463Medlem sedan dec. 201349 inlägg Eller... jag vet hur man plockar ut enstaka rader ut databasen och summera dessa.
så här ser det isåfall ut för 24h:
$query = "SELECT SUM(B10000000D076C1D) FROM logtemp WHERE id IN(11, 41, 71, 101, 131, 161, 191, 221, 251, 281, 311, 341, 371, 401, 431, 461, 491, 521, 551, 581, 611, 641, 671, 701)";
Men jag vill inte göra detta manuellt för varje dag utan att jag lägger in en kod som automatiskt plussar ihop var 30:e rad för varje dygn, Går det?
rhdfMedlem sedan okt. 2007446 inlägg
7516463 skrev:
Nä förbrukningen är ju inte konstant utan ökar lite olika beroende på förbrukningen.
Det jag menade var att datan ser ut att vara "total förbrukning" sedan senaste reset. Skulle det vara aktuell förbrukning / 2 minuter så skulle ju ingen reset behövas. Så för att få förbrukningen mellan 2 klockslag så är det just sista värdet innan reset (dvs XX:59) som är aktuellt.
På något sätt känns det som att
SELECT * FROM logtemp WHERE MINUTE(DateTime)=59 borde funka, men jag har inte testat det
Edit:
Testade nu med en databas där jag hade massa datetime-värden
Select HOUR(datetime), B10000000D076C1D from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now());
Skall ge dig en lista med timme och förbrukning för alla poster med minutvärde=59 för dagens datum.
Således borde väl
Select SUM(B10000000D076C1D) from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now()); ge dygnsförbrukningen
7516463Medlem sedan dec. 201349 inlägg ok en bit på vägen...
men om jag använder:
$query = "Select SUM(B10000000D076C1D) from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now())";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
echo round ($row['SUM(B10000000D076C1D)'], 2);
echo " kWh";
}
så får jag bara u "0"
@ndersMedlem sedan juni 200032 969 inlägg Du kanske måste sätta ett alias i din fråga - jag är inte säker på att du kan referera till SUM() i din PHP-utskrift.
$query = "Select SUM(B10000000D076C1D) as summa from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now())";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
echo round ($row['summa'], 2);
echo " kWh";
}
mvh
7516463Medlem sedan dec. 201349 inlägg Nä, det ger bara 0...har provat med ' ` på DATETIME då kolumnen heter just DATETIME...men inget.
rhdfMedlem sedan okt. 2007446 inlägg Udda, jag testade förvisso bara konceptet att filtrera på minuter mm.
Har du testat att köra queryn direkt i MySQL workbench eller liknande, Då ser du ju om den ö.h.t returnerar nånting. Sen är ju frågan vad det är för datatyp på fältet B10000000D076C1D samtidigt ser du ju vad du har för värden.
Jag slängde ihop en test-tabell med samma fältnamn (utan id)
datetime B10000000D076C1D
2014-05-28 17:58:13 0.0000
2014-05-28 17:59:39 0.1000
2014-05-28 18:01:34 0.2000
2014-05-28 18:01:39 0.3000
2014-05-28 18:01:42 0.4000
2014-05-28 18:02:33 0.2000
Queryn
SELECT SUM(B10000000D076C1D) FROM logtemp WHERE MINUTE(`datetime`)=1 AND Date(`datetime`)=DATE(now());
returnerade mycket riktigt 0.9000