Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Pobieranie rekordów z przedziału czasu (data, godzina)
jurcio6
post 24.11.2010, 12:32:32
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Witam,

Tabela: 'sensor'
Pola:
'id' (auto-increment)
'sDate' (YYYY-MM-DD)
'sTime' (HH:MM:SS)
'temperature' (int)
'light' (int)

Mam problem z zapytaniem, które ma pobierać z tabeli wartości w danym przedziale czasu - np. od dnia 2010-11-05 od godziny 09:00:00, do dnia 2010-11-10 do godziny 10:00:00.

Zapytanie, które napisałem, zamiast pobierać wszystkie rekordy z zakresu, pobiera mi rekordy z każdego dnia pomiędzy określonymi godzinami - wiem, że jest ono błędne i wiem czemu tak działa, ale nie wiem jak je poprawić, aby spełniało podaną wyżej funkcjonalność:
  1. SELECT temperature, light, sTime, sDate FROM sensor WHERE ((sDate BETWEEN '2010-11-05' AND '2010-11-10') AND (sTime BETWEEN '09:00:00' AND '10:00:00')) ORDER BY sDate, sTime DESC


Zapytanie ma zwrócić wszystkie rekordy od godziny 09:00:00 dnia 2010-11-05 do godziny 10:00:00 dnia 2010-11-10. W jaki sposób to napisać, aby było jak najbardziej optymalne? Będzie ono dosyć często wywoływane, ponieważ czujnik uploaduje dane co kilkadziesiąt sekund, więc musi być w miarę szybkie.

Proszę o pomoc!
Go to the top of the page
+Quote Post
wookieb
post 24.11.2010, 12:35:26
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zapisz datę w jednym polu jako timestamp lub datetime (jak wolisz). Rozbicie na te 2 pola nie ma sensu.


--------------------
Go to the top of the page
+Quote Post
jurcio6
post 24.11.2010, 18:03:05
Post #3





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


Hmm dla mnie trochę ma - chodzi o to, że dane, które wyciągam, przekazuje do funkcji, która tworzy wykresy - jeśli nie mam odczytu z czujnika, to wówczas mam w php funkcję, która robi sztuczne dane dla wykresu (wstawia 0 w miejsca z czasem, gdzie nie ma odczytów - zera te są co 30 sekund, łatwiej jest wówczas operować na samym czasie, niż bawić się jeszcze z datą w jednym polu).

1. Załóżmy, że faktycznie data i czas były by w jednym polu - jak wówczas wykonać takie zapytanie, o jakie chodziło mi w pierwszym poście? Wystarczy zwykłe "select ... where date between dzien_i_godzina_start and dzien_i_godzina_stop" ?

2. Jeśli jednak nie zmienię struktury BD, to czy da się to zrealizować jednym zapytaniem? Jeśli nie, to w jaki inny sposób? Czy będzie to tak samo optymalne, jak w punkcie 1. ?

Ten post edytował jurcio6 24.11.2010, 18:03:57
Go to the top of the page
+Quote Post
#luq
post 24.11.2010, 20:18:40
Post #4





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

Ostrzeżenie: (0%)
-----


Zajrzyj do manual Mysql`a. Będziesz odejmował późniejszy czas od wcześniejszego i na tej podstawie tworzył warunek...
Tak naprawdę rozłożenie tych danych na dwa pola nic nie zmienia (no, poza tym, że będzie to lekko mniej wydajne no i też trochę nieużyteczne...), zawsze możesz oba te pola w warunku złączyć w jedno - datatime i je porównywać.


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
jurcio6
post 26.11.2010, 16:13:56
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 4.11.2010

Ostrzeżenie: (0%)
-----


a lepiej takie czasy odejmować w SQL'u czy też w PHP (też ma obiekty typu DateTime i przeróżne metody do manipulowania nimi) i przesłać do SQL'a gotowe zapytanie? Co jest bardziej wydajne?

Ten post edytował jurcio6 26.11.2010, 16:14:28
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: 24.07.2025 - 14:44