Czy SEC_TO_TIME na ograniczenie jakieś?

0

Do tej pory korzystałem z zapytania:

$zapytanie5 = "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(Czas))) AS MaxPredkosc FROM $tabela WHERE data <= '$Data'";
							$db->set_charset("utf8"); 
							$wynik5 = $db->query($zapytanie5);
							$tablica5 = $wynik5->fetch_assoc();
							$baza = $tablica5 ['MaxPredkosc'];

które liczyło czas w sekundach wszystkich wpisów ... i podawało wynik.
Niestety licznik zatrzymał się na wartości:

Czas Jazdy Suma (ever): 838:59:59 h

I dalej nie idzie ... Zapytanie nie zmienione. Do 838 godzin wszystko działa. Po 838 nie działa. To ograniczenie SEC_TO_TIME czy o co chodzi? I ew. jak to naprawić?

0

sec_to_time zwraca typ time i jak wynika z dokumentacji: ma zakres: '-83859' to '83859'

Pozostaje to sformatować po strnie PHP: https://stackoverflow.com/questions/3856293/how-to-convert-seconds-to-time-format

0

A nie da się po stronie SQL tego zrobić? aby już nie mieszać w tym PHP?
swoją drogą nie wiem za bardzo co miałbym parsować w PHP...

skoro teraz daję po prostu:

echo "Czas Jazdy Suma (ever): <b>".$baza."</b> h";
0

A nie da się prościej? nie za bardzo widzę jak to zaadaptować do swojego rozwiązania

raczej liczyłem na podmianę funkcji w SQL niż jakieś dziwne twory

0

Jeżeli funkcja mysql sec_to_time zwraca time a ty wychodzisz poza jej zakres to masz 2 sposoby napisac funkcje samemu i jej użyć, lub policzyć bezpośredno w zapytaniu i jak to zrobić masz w tych postach na SO.
Opcja druga to napisanie funkcji w PHP i jej użyć do pokazania wyniku. Prościej się nie da, rozwiązania mysql masz podane na tacy, ciężko to zrobić prościej, skoro gotowiec nie wystarcza...

0

zaraz się pewnie czepicie ...
ale ja programistą nie jestem i to mnie trochę przerasta ;]

drop function if exists my_sec_to_time;
delimiter $$
create function my_sec_to_time(p_sec int)
returns varchar(10)
deterministic
begin
declare v_hour int;
declare v_minute int;

declare v_tmp_sec int;

set v_hour = floor(p_sec / 3600);
set v_tmp_sec = p_sec - (v_hour * 3600);
set v_minute = floor(v_tmp_sec / 60);
set v_tmp_sec = v_tmp_sec - (v_minute * 60);

return concat(v_hour, ':', v_minute, ':', v_tmp_sec);

end $$

delimiter ;

ja mam ten kod z stąd:
https://stackoverflow.com/questions/23293116/how-to-convert-second-to-time-using-mysql

WYWOŁAĆ PRZEZ PHP podając jako SECONDS wynik zapytania:

SELECT SUM(TIME_TO_SEC(Czas)) AS `suma` FROM $tabela WHERE data <= '$Data'

?? czy jak ??

1

Jeżeli korzystasz z phpmyadmin

  1. Logujesz się w phpmyadmin
  2. Na drzewku po lewej klikasz bazę na której masz te zapytanie puszczane w php
  3. Klikasz zakładke sql
  4. Wklejasz kod ze swojego posta
  5. Klikasz wykonaj
  6. Klikasz jeszcze raz sql i wklejasz zapytanie
select my_sec_to_time(4444000)
  1. klikasz wykonaj

Powinno zwrócić:

my_sec_to_time(4444000) 

1234:26:40

w pliku PHP zmieniasz zapytanie:
z

$zapytanie5 = "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(Czas))) AS MaxPredkosc FROM $tabela WHERE data <= '$Data'";

na

$zapytanie5 = "SELECT MY_SEC_TO_TIME(SUM(TIME_TO_SEC(Czas))) AS MaxPredkosc FROM $tabela WHERE data <= '$Data'";

Koniec

0

i znowu :

Czas Jazdy Suma (ever): 838:59:59 h

ogranicznik .... a zrobiłem tak jak pisałeś.
utworzyła mi się w mysql ta funkcja.

funkcja z poziomu PHPMyAdmin działa:
wybrałem wykonaj funkcję i w jej okienku wpisałem sekundy

SET @p0 =  '3240000';

SELECT  `my_sec_to_time` (
@p0
) AS  `my_sec_to_time` ;

nie działa natomiast z poziomu PHP

0

Czy w php w zapytaniu masz funkcje my_sec_to time ?

0

Skopiowałem to co dałeś:

$zapytanie5 = "SELECT MY_SEC_TO_TIME(SUM(TIME_TO_SEC(Czas))) AS MaxPredkosc FROM $tabela WHERE data <= '$Data'";

poprzednią za komentowałem :)

a to nie jest tak, że trzeba do funkcji podać argument jako @p1 ?

1

To mi pachnie jakby skrypt php był puszczany w starej wersji, jakiś cache webservera…
Bo jeżeli funkcja działa i zwraca dobre wartości przez phpmyadmin to nie ma innej możliwości

a to nie jest tak, że trzeba do funkcji podać argument jako @p1 ?

Nie

0

Działa dzieki :)

Mam jeszcze pytanie kosmetyczne.
Mogę wyświetlić wynik nie tak:

Sredni czas jazdy w miesiacu: 157 h

a tak:

Sredni czas jazdy w miesiacu: 0157 h

? po prostu wyświetlić 01 a nie 1

1

Aby dodać zera, użyj funkcji LPAD

drop function if exists my_sec_to_time;
delimiter $$
create function my_sec_to_time(p_sec int)
returns varchar(10)
deterministic
begin
declare v_hour int;
declare v_minute int;

declare v_tmp_sec int;

set v_hour = floor(p_sec / 3600);
set v_tmp_sec = p_sec - (v_hour * 3600);
set v_minute = floor(v_tmp_sec / 60);
set v_tmp_sec = v_tmp_sec - (v_minute * 60);

return concat(v_hour, ':', LPAD(v_minute,2,'0'), ':', LPAD(v_tmp_sec,2,'0'));

end $$

delimiter ;
0

Dzieki działa:)

0

Z ciekawości - da się połączyć dwa warunki - zwróć

jeśli liczba jest dwu cyfrowa (hours)

return concat(LPAD(v_hour,2,'0'), ':', LPAD(v_minute,2,'0'), ':', LPAD(v_tmp_sec,2,'0')); 

i zwróć jeśli liczba jest trzy lub więcej cyfrowa?

return concat(v_hour, ':', LPAD(v_minute,2,'0'), ':', LPAD(v_tmp_sec,2,'0')); 

rozwiązałem to na dwóch funkcjach :P i działa:

Czas jazdy: 01:17:46 h
Czas Jazdy Suma (ever): 871:17:02 h
Czas Jazdy Suma (2019): 14:59:56 h
Średni czas jazdy w miesiacu: 01:29:57 h
Średni czas jazdy w tym roku: 01:09:14 h
Średni czas jazdy do tej pory: 02:26:26 h

wcześniej ucinało ever do poziomu:

Czas Jazdy Suma (ever): 87:17:02 h
1

Nie trzeba dodatkowej funkcji wystarczy dodać 0 na początku, jeżeli v_hour < 10:

return concat(case when v_hour<10 then '0' else '' end,v_hour, ':', LPAD(v_minute,2,'0'), ':', LPAD(v_tmp_sec,2,'0'));
0

Jest jeszcze sposób bez sprawdzania... ZAWSZE dodać zera na początku a funkcją RIGHT wyciąć odpowiednia ilość znaków.

0

Sposób Panczo działa :) I jest ok. Nie ma co kombinować, kod tego bloga to i tak burdel taki, że strasz patrzeć :D

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