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...
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...
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
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
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.
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
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.
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
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";
}
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)