[Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Wszystko co może pomóc w rozwoju serwisu opencaching.pl, sugestie, pomysły, także zauważone błędy

Moderator: Moderatorzy

Awatar użytkownika
Highlander
Forumator
Posty: 1353
Rejestracja: czwartek 12 lutego 2009, 22:31
Podziękował;: 31 razy
Otrzymał podziękowań: 55 razy

[Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Post autor: Highlander »

Taki ciekawy bug który płata mi figle. Od dawna zastanawiałem się czemu w niektórych skrzynkach mam sugerowany czas przejścia 19 minut (0.19) jeśli nigdy takiego nie wprowadzałem.

Ostatni odkryłem że nie da się podać czasu przejścia 0:20 - po wpisaniu takiego, system zapisze go jako 0:19. Jeśli wpiszę 0:19 będzie 0:19, wpiszę 0:21 będzie 0:21. Inne przypadkowo dobrane również wchodzą bez problemu. Tylko tego czasu = 0:20 nie chce przyjąć.

Prosiłbym RT o zerknięcie w kod "editcache.php" aby zobaczyć co może być przyczyną.
ObrazekObrazekObrazek
Awatar użytkownika
r00t7
Forumator
Posty: 2065
Rejestracja: niedziela 19 lipca 2009, 22:26
Podziękował;: 367 razy
Otrzymał podziękowań: 274 razy

Re: [Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Post autor: r00t7 »

potwierdzam zaistnienie takiego błędu ;)
Obrazek Obrazek
Awatar użytkownika
sp2ong
Forumator
Posty: 2199
Rejestracja: środa 20 lutego 2008, 14:10
Podziękował;: 10 razy
Otrzymał podziękowań: 100 razy

Re: [Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Post autor: sp2ong »

Znalazlem problem ktory jest wlasciwie od samego poczatku OC kodu. Z jakis przyczyn autorzy kodu zdecydowali sie zapisywac w bazie czas drogi w formie: (wartosc podana minut)/60 w wyniku czego mamy dla 20 min wartosc 0.33333 i teraz dokladnosc tej cyfry determinuje odtworzenie dokladnosc minut bo pomnozenie przez 60 liczby 0.3333 daje nie dokladnie 20 min tylko 19.xxx i teraz im wieksza dokladnosc zapisu formatu 0.xxxxxxxx tym mozliwosc odtworzenia minut jest blizsza. Pewnie trzeba by cos pokombinowac, bo zmienic kod na zapis 00:20 nie problem ale trzeba przy tej okazji zamienic wszystkie wpisy w bazie z formatu minut z 0.xxxx na 00:xx

Zastosowalem zaokraglanie liczby wiec powinno byc OK. Jesli zauwazycie jakies niedokladnosci dajcie znac
Za ten post autor sp2ong otrzymał podziękowanie:
Highlander
Waldek
OpenGeoInfo -Serwis informacyjny o Geocaching OC PL http://info.opencaching.pl
Awatar użytkownika
Highlander
Forumator
Posty: 1353
Rejestracja: czwartek 12 lutego 2009, 22:31
Podziękował;: 31 razy
Otrzymał podziękowań: 55 razy

Re: [Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Post autor: Highlander »

20 minut już działa, dzięki za bugfixa :)
ObrazekObrazekObrazek
Awatar użytkownika
Limak
Stały bywalec
Posty: 106
Rejestracja: niedziela 16 sierpnia 2009, 22:25
Podziękował;: 5 razy
Otrzymał podziękowań: 9 razy

Re: [Skrzynki] Czas przejścia trasy - nie da się wpisać 20 minut

Post autor: Limak »

sp2ong pisze:Pewnie trzeba by cos pokombinowac, bo zmienic kod na zapis 00:20 nie problem ale trzeba przy tej okazji zamienic wszystkie wpisy w bazie z formatu minut z 0.xxxx na 00:xx

Zastosowalem zaokraglanie liczby wiec powinno byc OK. Jesli zauwazycie jakies niedokladnosci dajcie znac
no z pewnością zapis XX:XX lepszy ale ja bym proponował po prostu integera z samymi minutami - najlatwiej ;) Albo TIME :)

Aby nie było potrzeby zaokrąglania w kodzie liczb za każdym razem, można odrazu wykonać konwersję dla całej tabeli tylko jeden raz i cieszyć się już z nowego formatu :)

Kod: Zaznacz cały

UPDATE kesze AS t1, kesze AS t2 SET t1.czas = ROUND(t2.czas*60) WHERE t1.id = t2.id;
ALTER TABLE kesze CHANGE czas czas SMALLINT NOT NULL 
(nie znam nazw tabel ani kolumn, wiec podałem przykladowe ;) )
Oczywiście jeszcze mała zmiana w kodzie dodawania/edycji kesza oraz w wyswietlaniu i bedzie git:)

Lub jak wolicie, to może być też zmienione na time, czyli chyba najlepiej jak może być:) Niestety, tego już się nie da zrobić w locie jak z zamianą na integera, ale można tak:

Kod: Zaznacz cały

CREATE TABLE kesze2 SELECT * FROM kesze;
ALTER TABLE kesze CHANGE czas czas TIME NOT NULL;
UPDATE kesze AS t1, kesze2 AS t2 SET t1.czas = MAKETIME(FLOOR(t2.czas),ROUND((t2.czas-FLOOR(t2.czas))*60),0) WHERE t1.id = t2.id;
DROP TABLE kesze2;
Testowałem na przykładowej bazie stworzonej na szybko i działa :) na OC.pl też powinno ;)

Minusem pierwszego rozwiązania jest oczywiście konieczność mnożenia przez 60 przy wyświetlaniu czasu aby uzyskać godziny, ale za to plusem jest to, że nie mamy ograniczenia do 24 godzin, jak w przypadku drugiego rozwiązania z TIME.
Obrazek
ODPOWIEDZ