![]() |
![]() ![]() |
![]() |
![]()
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ść:
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! |
|
|
![]()
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.
-------------------- |
|
|
![]()
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 |
|
|
![]()
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
|
|
|
![]()
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 14:44 |