Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie rekordów z przedziału czasu (data, godzina)
Forum PHP.pl > Forum > Bazy danych > MySQL
jurcio6
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!
wookieb
Zapisz datę w jednym polu jako timestamp lub datetime (jak wolisz). Rozbicie na te 2 pola nie ma sensu.
jurcio6
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. ?
#luq
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ć.
jurcio6
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?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.