Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> konwersja dużej ilości danych w 60 MB bazie danych
edgar5
post 21.12.2012, 15:10:49
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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:13