Przerobienie zapytania

0

Hej, przerabiam swój skrypt i potrzebuję dokonać lekkiej modyfikacji zapytania, lecz akurat z tym już nie umiem sobie poradzić. Mam takie zapytanko:

SELECT timestamp, SUM(users) as userscount FROM servers_users WHERE account_id = '.$profile['id'].' GROUP BY hash ORDER BY timestamp DESC LIMIT 24

Do tej pory w bazie miałem rekordy co godzinę, więc zapytanie było okej. Jednak teraz zwiększam częstotliwość rekordów i trzeba edytować zapytanie by brało tylko rekordy z każdej godziny (i najlepiej aby nie brało pod uwagę sekund/minut, tylko same godziny; 19:00, 20:00, 21:00...)

0

Jeżeli dobrze rozumiem to coś w ten deseń:

SELECT DATE_FORMAT(timestamp, '%Y-%m-%d %H:00') , SUM(users) as userscount FROM servers_users WHERE account_id = '.$profile['id'].' GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:00') ORDER BY 1 DESC LIMIT 24
0

Jak wiele kwerend datowych tracą wydajność przy przekształceniach za pomocą wyrażeń - tracą wykorzystanie indeksów. Wiele zależy jak naprawdę jest zadeklarowana tabela, warto datę/czas traktować zgodnie ze zwoją specyfiką - np w stringach i nie jakieś formatowania narodowe.

0
Panczo napisał(a):

Jeżeli dobrze rozumiem to coś w ten deseń:

SELECT DATE_FORMAT(timestamp, '%Y-%m-%d %H:00') , SUM(users) as userscount FROM servers_users WHERE account_id = '.$profile['id'].' GROUP BY DATE_FORMAT(timestamp, '%Y-%m-%d %H:00') ORDER BY 1 DESC LIMIT 24

Myślałem, że to wystarczy. Sorki.
Moja baza wygląda tak:
title
Czas w timestamp jest poprawny.

Na screenie rekordy są dodawane jeszcze co godzinę. I zapytanie

SELECT timestamp, SUM(users) as userscount FROM servers_users WHERE account_id = '.$profile['id'].' GROUP BY hash ORDER BY timestamp DESC LIMIT 24

Działa dobrze, bo wybiera ostatnie 24 rekordy. Teraz planuję by w tej tabeli były rekordy dodawane co 10 minut, a przez zapytanie wybierane tylko ostatnie 24 rekordy z pełnymi godzinami (nie licząc sekund, bo rekordy mają różne końcówki - 1538719203, 1538719202, 1538719201)

0
abrakadaber napisał(a):

dodaj warunek, że minuty = 0 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_minute

Coś takiego?

SELECT timestamp, SUM(users) as userscount FROM servers_users WHERE MINUTE(timestamp) = 0 AND account_id = 1 GROUP BY hash ORDER BY timestamp DESC LIMIT 24

Wtedy też wyskakują mi błędy:
Incorrect datetime value: '1538492402' for column 'timestamp' at row 1

0
AnyKtokolwiek napisał(a):

Jak wiele kwerend datowych tracą wydajność przy przekształceniach za pomocą wyrażeń - tracą wykorzystanie indeksów. Wiele zależy jak naprawdę jest zadeklarowana tabela, warto datę/czas traktować zgodnie ze zwoją specyfiką - np w stringach i nie jakieś formatowania narodowe.

Gosz...
Wy tam naprawdę nie wiecie że bazy danych posiadają typy danych przeznaczone do przechowywania daty, czasu, daty i czasu?
Data w stringach?
Tia, najlepiej w majtach...

0

Nie wiem jakiego typu masz kolumnę timestamp, ale nie jest to mysql'owy typ timestamp, aby operować na danych i wykorzystywać funkcje daty/czasu musisz przekazywać do niej prawidłowe dane.
silnik nie domyśli się jak nie pasuje, o czym cie poinformował stosownym komunikatem, jak już nie konwertujesz do odpowiednich typów danych podczas importu, to nie pozostaje nic innego jak konwertowanie w locie podczas wykonywania zapytań.

Domyślam się że masz tam unixowy timestamp więc zainteresuj się tym: https://www.epochconverter.com/programming/mysql

1 użytkowników online, w tym zalogowanych: 0, gości: 1