![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 218 Pomógł: 0 Dołączył: 14.04.2004 Skąd: Słupsk, Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Chodzi o to, że z bazy chcę pobrać dane do wykresu... w bazie są dane posegregowane po czasie (unix_timestamp), ale nie są regularne... tzn czasem są co minutę, czasem co godzinę, a czasem nie ma przez miesiąc...
kiedy chcę pobrać sobie dane na dowolny moment, to po prostu daję to: "SELECT `wartosc` FROM `dane` WHERE `czas`<=$czas ORDER BY `czas` DESC;" i w ten sposób dostaję ostatnią znaną wartość na podany czas... problem się robi wtedy, kiedy chce zrobić z tego wykres... i np. 100 takich danych dla różnych czasów chcę uzyskać... jak to zrobić w jednym zapytaniu, a nie w 100? Przyszło mi do głowy, by stworzyć podzapytanie dzielące $czas przez interwal jaki potrzebuję, wtedy po zaokrągleniu kolejne czasy będą kolejnymi intami... i wtedy zrobić WHERE BETWEEN, ale nie wiem czy to dobry trop i to się tak robi, czy może należy spróbować czegoś bardziej sensownego... Przy czym nadal nie wiem jak uzyskać "komplet" danych... że jak nie ma danej dla danego czasu, to ma zwrócić ostatni poprzedni... pozdrawiam, Phoenix Ten post edytował phoenix84 3.09.2016, 14:09:11 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Który to ostatni poprzedni?
Przykład: 05:00 A 05:00 B 05:00 C 05:00 D 07:00 E 15:00 F 15:00 G Który rekord mam wybrać dla 05:00, a który dla 10:00? Zakładamy interwał 5 minut. Ten post edytował trueblue 3.09.2016, 14:54:21 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 218 Pomógł: 0 Dołączył: 14.04.2004 Skąd: Słupsk, Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Teoretycznie w bazie dla tego samego czasu musi być ten sam wynik i nie powinien się zdarzyć taki dubel... no chyba, że zrobimy ten numer z dzieleniem przez interwal... ale zakladajac czarny scenariusz, zawsze bierzemy najnowszy czyli najpozniejszy spelniajacy warunek...
Dla 05:00 będzie to D, a dla 10:00 E. Przy interwale 5 minut nie ma problemu, bo wszystkie godziny są podzielne przez 5 minut (IMG:style_emoticons/default/smile.gif) ... Na wszelki wypadek dam przykład dla godzin, gdzie to ma znaczenie: Przykład: 05:00 A 05:00 B 05:00 C 05:00 D 07:00 E 15:00 F 15:00 G Dla 6:59 będzie to D, dla 07:00 E, dla 07:01 E ... dla 14:59 E, dla 15:00 G, dla 15:01 G Mam nadzieję, że teraz jasne. Dziękuję. phoenix84 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Mam nadzieję, że się połapiesz.
Założenia: - początek przedziału od 10:00, - interwał co minutę, - długość interwału 100 minut, http://sqlfiddle.com/#!9/b4617a/1 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 218 Pomógł: 0 Dołączył: 14.04.2004 Skąd: Słupsk, Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
chyba ogarne, dziekuje...
jak cos to jeszcze bede pytal... ale juz widze, ze sam bym na to nie wpadl... (IMG:style_emoticons/default/smile.gif) wlasnie przy tym dlubie... (IMG:style_emoticons/default/smile.gif) pozdrawiam i dziekuje, phoenix84 a jak mam w bazie czasy uniksowe (int) a nie date? to jak te linie przerobic? interwal tez jest int w sekundach... SEC_TO_TIME(TIME_TO_SEC(STR_TO_DATE('10:00', '%H:%i')) + a.sekunda*60) as interwal, TIME_TO_SEC(DATE_ADD(STR_TO_DATE('10:00', '%H:%i'),INTERVAL a.sekunda*60 SECOND))-TIME_TO_SEC(TIME(z.czas)) as roznica ? i od czego zalezy, ze wybiera zlecenie 2 lub 3? bo powinno albo zawsze jedno, albo zawsze drugie, a nie widze zasady... Ten post edytował phoenix84 3.09.2016, 19:13:53 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Przy równych wartościach wynik ORDER BY jest nieokreślony.
Jeśli chcesz "ustabilizować" wynik, to w GROUP_CONCAT możesz dodać kolejne pole do ORDER BY (np. jakieś id). https://dev.mysql.com/doc/refman/5.5/en/dat...n_from-unixtime Przy czym jeśli zamiast konwertować timestamp na datę, być może łatwiej by było operować od razu na timestamp. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 218 Pomógł: 0 Dołączył: 14.04.2004 Skąd: Słupsk, Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
https://dev.mysql.com/doc/refman/5.5/en/dat...n_from-unixtime Przy czym jeśli zamiast konwertować timestamp na datę, być może łatwiej by było operować od razu na timestamp. O tym mówię (IMG:style_emoticons/default/smile.gif) . Ja od razu operuję na timestamp (nie uzywam nic innego przez pozniejsze problemy ze strefami czasowymi i innymi problemami). Napisałem to w pierwszym poście: "w bazie są dane posegregowane po czasie (unix_timestamp)". Jak pominąć te wszystkie konwersje, bo i czas w bazie jest w timestamp i interwal bedzie jako int w sekundach (czyli bedzie np. 90, a nie 00:01:30)... phoenix84 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
Ja miałem na myśli zmianę zapytania w tym kontekście, nie fakt używania.
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 218 Pomógł: 0 Dołączył: 14.04.2004 Skąd: Słupsk, Nowy Sącz Ostrzeżenie: (0%) ![]() ![]() |
Zgubiłem się... (IMG:style_emoticons/default/smile.gif)
duży to problem zamienić na timestampy? podeślij też jakiś adres bitcoinowy do dotacji na browar za pomoc jak mi to już będzie działać... phoenix84 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.09.2025 - 04:40 |