![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 29 Pomógł: 0 Dołączył: 12.10.2007 Ostrzeżenie: (0%) ![]() ![]() |
Hej
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(); 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(); 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? Ten post edytował edgar5 21.12.2012, 15:13:44 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 07:13 |