Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sumowanie godzin
Forum PHP.pl > Forum > Przedszkole
peklo
witam
Mam takie oto zapytanie, które wyswietla mi nadgodziny dla danego pracownika

  1. SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny
  2. FROM karta kar
  3. INNER JOIN karta_s ser ON kar.id=ser.id_karta
  4. INNER JOIN user us ON us.id=ser.us
  5. WHERE us.id=:id


W wyniku czego otrzymuję coś mniej więcej takiego
5:33
4:40
dla pracownika np: Kowalski
Potrzebuję w tym zapytaniu jeszcze sumowania tych godzin czyli na końcu wyniku 10:13.
kartin
Trzeba skonwertować na sekundy, zsumować i skonwertować z powrotem na godziny:
  1. SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny
  2. FROM karta kar
  3. INNER JOIN karta_s ser ON kar.id=ser.id_karta
  4. INNER JOIN user us ON us.id=ser.us
  5. WHERE us.id=:id
peklo
ale tym zapytaniem otrzymam wyszczególnione godziny + ich suma ponizej? Czy tylko sume? Bo może źle się wyraziłem ale potrzebuje tego i tego smile.gif
A może trzeba to rozbić na dwa zapytania
kartin
Jak bardzo potrzebujesz wyszczególnionych godzin oraz ich sumy zwróconych w jednym zapytaniu to użyj UNION do poszczególnych nadgodzin dołączając ich sumę:
  1. SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny
  2. FROM karta kar
  3. INNER JOIN karta_s ser ON kar.id=ser.id_karta
  4. INNER JOIN user us ON us.id=ser.us
  5. WHERE us.id=:id
  6. UNION
  7. SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny
  8. FROM karta kar
  9. INNER JOIN karta_s ser ON kar.id=ser.id_karta
  10. INNER JOIN user us ON us.id=ser.us
  11. WHERE us.id=:id
Ostatni wiersz wyniku będzie sumą nadgodzin.
peklo
no tak ostatni wiersz wyniku. Teraz otrzymuje coś takiego

5:33
10:13

gubi mi 4:40. No chyba że coś źle robie

ok, a jak zsumować te nadgodziny za pomocą php
nospor
Cytat
ok, a jak zsumować te nadgodziny za pomocą php
Normalnie... pobierasz te wartosci po kolei i sumujesz.
peklo
próbowałem ale głupoty wychodzą
nospor
No przeciez... naprawde nie widzisz ze masz blad w linii 3 swojego kodu? Zamiast xxx masz wstawic yyy

Przenosze
peklo
jakie xxx jakie yyy?
nospor
O zobacz, ty też na podstawie kodu, ktorego nam nie pokazales a z ktorym masz problem, tez nie mozesz dojsc o jakie xxx i jakie yyy chodzi? No zobacz, to jest nas dwoch...
kartin
Cytat(peklo @ 10.09.2015, 14:57:59 ) *
jakie xxx jakie yyy?
Widać ma awarię szklanej kuli i dlatego, źle odgadł gdzie masz błąd.

Cytat(peklo @ 10.09.2015, 14:33:29 ) *
no tak ostatni wiersz wyniku. Teraz otrzymuje coś takiego

5:33
10:13

gubi mi 4:40. No chyba że coś źle robie
Dokładnie. Coś robisz źle. Niestety nie wiadomo co, bo nie pokazałaś jak robisz, a mało kto ma działającą szklaną kulę.
Wpisz sobie zapytanie bezpośrednio w jakimś kliencie MySQL (np. phpMyAdmin) i zobaczysz, że dostaniesz wszystkie wyniki. Na wszelki wypadek dodaj ALL po UNION, bo możesz mieć w kilku dniach ten sam czas nadgodzin.

Cytat(peklo @ 10.09.2015, 14:33:29 ) *
ok, a jak zsumować te nadgodziny za pomocą php

http://lmgtfy.com/?q=PHP+how+to+sum+times
nospor
Cytat
Widać ma awarię szklanej kuli i dlatego, źle odgadł gdzie masz błąd.
Kula w naprawie, wrozylem z fusów... ale to z wczorajszych, bo nie mialem swiezych... to pewnie dlatego źle odgadlem... wink.gif
peklo
nie bo teraz skupiam się na czymś innym ,a to tak przy okazji

Kod wygląda mniej więcej tak

  1. try
  2. {
  3. $sql = "SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny,
  4. kar.id karid,ser.id serid
  5. FROM karta kar
  6. INNER JOIN karta_s ser on kar.id=ser.id_karta
  7. INNER JOIN user us on us.id=ser.us
  8. WHERE us.id=:id and ser.godz_powr>:godz_powr
  9. UNION ALL
  10. SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny,
  11. kar.id karid,ser.id serid
  12. FROM karta kar
  13. INNER JOIN karta_s ser on kar.id=ser.id_karta
  14. INNER JOIN user us on us.id=ser.us
  15. WHERE us.id=:id and ser.godz_powr>:godz_powr";
  16. $stmt = $pdo->prepare( $sql );
  17. $stmt -> bindValue(':godz_powr','16:00:00', PDO::PARAM_STR);
  18. $stmt -> bindValue(':id',$id, PDO::PARAM_INT);
  19. $stmt -> execute();
  20.  
  21. $dan = array();
  22. while($row = $stmt -> fetch())
  23. {
  24. $karid = $row['karid'];
  25. if (!isset($dan[$karid]))
  26. $dan[$karid] = array('serwisant'=>array()
  27. );
  28. if (!empty($row['serid']))
  29. $dan[$karid]['serwisant'][$row['serid']]= array('nadgodziny'=> $row['nadgodziny']
  30. );
  31. }
  32. foreach ($dan as $id_og => $rows)
  33. {
  34.  
  35. foreach ($rows['serwisant'] as $serw)
  36. {
  37. echo date("G:i",strtotime($serw['nadgodziny']) );
  38. }
  39. }
  40. $stmt->closeCursor();
  41. }
  42.  
  43. catch(PDOException $e)
  44. {
  45. echo 'error';
  46. }


i wyświetla mi
5:33
10:13 (SUMA)

gubi natomiast 4:40
nospor
To linijka
if (!empty($row['serid']))

$dan[$karid]['serwisant'][$row['serid']]= array('nadgodziny'=> $row['nadgodziny']

);


nadpisujesz godzine przez sume, ktora to suma ma identyczny serid. Albo w union nadaj jej recznie serid na chociazby 0 czy na cos co nie wystepuje,
albo wywal te union i licz te sume recznie w php... nie ogarniam jaki problem zrobic dla ciebie $suma+=$godzina;
Mnozysz niesamowicie problemy
peklo
robiłem coś s stylu "$suma+=$godzina;" i głupoty mi wychodziły
nospor
Dlatego juz dawno temu w tym temacie pisalem ci, bys podal kod, jak to robiles. Ale widze po chinsku pisze.
peklo
wiem wiem że pisałeś ale z tym próbowałem wczoraj i dałem sobie spokój, a miałem coś takiego:

  1. $suma+=date("G:i:s",strtotime($serw['nadgodziny']) );
  2. echo $suma;

Ale wyświetla mi tylko pełne godziny bez minut
nospor
1) Jakis czas temu w innym temacie miales kod w php, ktory dodaje godziny w twoim formacie. To jego masz uzyc do dodawania.
2) Jakis czas temu, w innym temacie pisalem ci, bys godziny trzymal w sekundach a nie w durnym formacie. Nie posluchales i teraz bez sensu sie bujasz z pierdulami. Na Twoje wlasne zyczenie.
mar1aczi
W php wartość dla godzin sumujesz normalnie. Minuty sumujesz i: suma minut dzielona przez 60 i wartość całkowitą dodajesz do godzin; suma minut modulo 60 i masz pozostałe minuty.
peklo
o tych sekundach nospor to pamiętałem ale za duż musiałbym wcześniej zmieniać więc wybrałem inne rozwiązanie, no a teraz się z tym bujam niestety
8_pasarzer_NOSTROMO
Witam
Podpowie ktoś jak szybko zsumować 2 godziny.
  1. 07:30:00 + 04:00:00 = 11:30:00
  2.  
  3.  
  4. Robię tak i ciagle wychodzi mi 10:30:00
  5. $a=07:30:00
  6. $b=04:00:00
  7.  
  8. $a1=strtotime($a);
  9. $b1=strtotime($b);
  10. $sum=$a1+$b1;
  11.  
  12. echo $suma=date('H:i:s', $sum); // 10:30:00 questionmark.gif? why

nospor
Zobacz na jakich danych dziala strtotime() oraz na jakich date() i co zwracaja i sie zastanow czy twoj kod ma jakikolwiek sens.... tip: nie ma

Uzyj poprostu explode() i dodaj recznie godziny i minuty i po sprawie.
8_pasarzer_NOSTROMO
być może zmylił mnie wynik bliski prawdzie. Ciągle uciekała mi 1 godzina. A czy jest prostszy sposób niż explode ?
nospor
A coz skomplikowanego jest w explode po dwukropku?
8_pasarzer_NOSTROMO
myślałem że jest jakaś funkcja która to zsumuje bez rozbijania. Dobra poradzę sobie jeśli takiej nie ma.
Tomplus
Był już kiedyś podobny wątek:
http://forum.php.pl/lofiversion/index.php/t187747.html
8_pasarzer_NOSTROMO
@Tomplus
I to jest odpowiedź jaką naród oczekuje od rządzących. Dzięki kolego.

Kolega @nospor w totalnej opozycji jest, 10 lat tu piszę i 2x pomógł bo się pomylił w głosowaniu. Zaraz mnie wygoni do manuala lub innego debugowania.
nospor
@8_pasarzer_NOSTROMO czyli co, dostales linka gdzie za ciebie zrobiono explode i ty juz nie musiales a ja niedobry napisalem tylko ze masz zrobic explode... faktycznie potwor ze mnie :/
8_pasarzer_NOSTROMO
@nospor
Oj wybacz ale czasami nie mam czasu na szukanie po manualach skoro ktoś już temat przerobił i ma gotowe rozwiązanie.

Jak syn ma czasami problem z zadaniem z matematyki kl. 5, to szuka w Google gotowego rozwiązania tego zadania, a nie sposobu jego rozwiązania. Ja i wielu innych mamy podobnie. Uwierz mi, że jak mam już kod to nie wklejam go bezmyślnie ino analizuje i dostosowuje do siebie.
nospor
Ani razu nie napisales, ze zrobienie explode to jakis problem. Jakbys napisal, ze masz z tym problemy, to bysmy poszli dalej. Milczales, a ja wrozka, wbrew opiniom, nie jestem
Tomplus
@Nospor
Wróżka programuszka biggrin.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.