Mam dwa pytania:
1.)
Zbieram dane z czujników temperatury w moim domu od 4 lat co 10 minut z 8 czujników wpływaja do bazy danych MySQL : stats, do tabeli: digitemp w pole: Fahrenheit
temperatury w st. Fahrenheita, które ja później konwertuję przez skrypt (DTGraph) do stopni Celsjusza. Baza danych ma już 60 MB, zarządzam nią z poziomu konsoli i phpMyAdmin. Na podstawie tych danych DTGraph (bazujący na silniku jgraph) rysuje mi świetnie zarządzane wykresy.
Problem pojawil się gdy postanowiłem przesyłać dane , których nie chce konwetowac do st Celsjusza obok tych , które chce konwetować (z 8 czujników chcę, z jednego - nie).
Fragment kodu php oprogramowania DTGraph, które odczytuje dane z bazy danych wygląda tak:
Kod
$q = 'SELECT *, unix_timestamp(time) unixtime';
$q .= ($units == 'Celsius' ) ? ' , ((Fahrenheit -32) * 5 / 9 ) Celsius' : '';
$q .= ' FROM ' . $this->_params['table'];
$q .= $this->makeWhereClause($sensors, $startDate, $endDate, $thinOutSql);
$q .= ' order by time ASC';
//echo $q;
$stop_watch['Made Query'] = microtime();
$q .= ($units == 'Celsius' ) ? ' , ((Fahrenheit -32) * 5 / 9 ) Celsius' : '';
$q .= ' FROM ' . $this->_params['table'];
$q .= $this->makeWhereClause($sensors, $startDate, $endDate, $thinOutSql);
$q .= ' order by time ASC';
//echo $q;
$stop_watch['Made Query'] = microtime();
Czyli jak widac kod odczytuje dane z bazy danych i jesli w pliku konfigguracyjnym : conf.php pojawi sie zmienna $units==Celsius to wetdy konwertuje w locie Fahrenheity do st. Celsiusza.
Ja chciałbym zrobic tutaj wyjątek dla jednego sensora (czyli z pola SerialNumber z tabeli digitemp gdzie SerialNumber="123456" i wyłaczyc ten sensor z przeliczania jak wyżej Fahr na Cels.
Podpowiem jeszcze że tabela digitemp składa sie z nastepujacych pół dtKey (int11), time(timestamp, czas odzczytu),SerialNumber(varchar17, kod sensora), Fahrenheit(decimal(6,2), czyli temperatura w st F).
Pomyślałem, że ów wyjatek mozna zrobić tak:
Kod
$q = 'SELECT *, unix_timestamp(time) unixtime';
$q .= ', CASE WHEN SerialNumber=\'123456\' THEN Fahrenheit Celsius ELSE ((Fahrenheit -32) * 5 / 9 ) Celsius END';
$q .= ' FROM ' . $this->_params['table'];
$q .= $this->makeWhereClause($sensors, $startDate, $endDate, $thinOutSql);
$q .= ' order by time ASC';
//echo $q;
$stop_watch['Made Query'] = microtime();
$q .= ', CASE WHEN SerialNumber=\'123456\' THEN Fahrenheit Celsius ELSE ((Fahrenheit -32) * 5 / 9 ) Celsius END';
$q .= ' FROM ' . $this->_params['table'];
$q .= $this->makeWhereClause($sensors, $startDate, $endDate, $thinOutSql);
$q .= ' order by time ASC';
//echo $q;
$stop_watch['Made Query'] = microtime();
niestety to nie działa.
Nie jestem biegły w programowaniu obiektowym w PHP no i bardziej zaawansowana skladnia SQL tez nie jest mi znana, jednak wydaje mi się , że forma zrobienia wyjatku dla sensora (aby nie przeliczac jego danych) da sie tylko obejść opcją CASE. Może się mylę?
2.)
Jak 60 MB bazie danych z poziomu zapytania w phpMyAdmin lub moze lepiej z konsoli (czas wykonywania skryptu php może byc ograniczony) przekonwertować wszytskie dane (jest ich 1 800 000) w polu Fahrenheit w tabeli digitemp wg wzoru:
5/9 * (Fahrenheit - 32) -> czyli zamienic je na st C ale zaokrąglając wynik do 2 miejsc po przecinku. (dane w polu Fahrenheit są liczbami z dwoma miejscami po przecinku).
Jak sformułowac takie zapytanie i ile czasu ono zajmie?Lepiej z konsoli czy z phpMyAdmin?