Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ sumowanie godzin

Napisany przez: peklo 10.09.2015, 11:14:17

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.

Napisany przez: kartin 10.09.2015, 11:35:58

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

Napisany przez: peklo 10.09.2015, 11:42:35

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

Napisany przez: kartin 10.09.2015, 11:55:02

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.

Napisany przez: peklo 10.09.2015, 13: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

ok, a jak zsumować te nadgodziny za pomocą php

Napisany przez: nospor 10.09.2015, 13:35:18

Cytat
ok, a jak zsumować te nadgodziny za pomocą php
Normalnie... pobierasz te wartosci po kolei i sumujesz.

Napisany przez: peklo 10.09.2015, 13:37:09

próbowałem ale głupoty wychodzą

Napisany przez: nospor 10.09.2015, 13:49:59

No przeciez... naprawde nie widzisz ze masz blad w linii 3 swojego kodu? Zamiast xxx masz wstawic yyy

Przenosze

Napisany przez: peklo 10.09.2015, 13:57:59

jakie xxx jakie yyy?

Napisany przez: nospor 10.09.2015, 14:01:21

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...

Napisany przez: kartin 10.09.2015, 14:03:48

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

Napisany przez: nospor 10.09.2015, 14:06:27

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

Napisany przez: peklo 11.09.2015, 11:28:15

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 = http://www.php.net/array();
  22. while($row = $stmt -> fetch())
  23. {
  24. $karid = $row['karid'];
  25. if (!http://www.php.net/isset($dan[$karid]))
  26. $dan[$karid] = http://www.php.net/array('serwisant'=>array()
  27. );
  28. if (!http://www.php.net/empty($row['serid']))
  29. $dan[$karid]['serwisant'][$row['serid']]= http://www.php.net/array('nadgodziny'=> $row['nadgodziny']
  30. );
  31. }
  32. foreach ($dan as $id_og => $rows)
  33. {
  34.  
  35. foreach ($rows['serwisant'] as $serw)
  36. {
  37. http://www.php.net/echo http://www.php.net/date("G:i",http://www.php.net/strtotime($serw['nadgodziny']) );
  38. }
  39. }
  40. $stmt->closeCursor();
  41. }
  42.  
  43. catch(PDOException $e)
  44. {
  45. http://www.php.net/echo 'error';
  46. }


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

gubi natomiast 4:40

Napisany przez: nospor 11.09.2015, 11:54:33

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

Napisany przez: peklo 11.09.2015, 11:59:07

robiłem coś s stylu "$suma+=$godzina;" i głupoty mi wychodziły

Napisany przez: nospor 11.09.2015, 12:28:17

Dlatego juz dawno temu w tym temacie pisalem ci, bys podal kod, jak to robiles. Ale widze po chinsku pisze.

Napisany przez: peklo 11.09.2015, 13:37:14

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+=http://www.php.net/date("G:i:s",http://www.php.net/strtotime($serw['nadgodziny']) );
  2. http://www.php.net/echo $suma;

Ale wyświetla mi tylko pełne godziny bez minut

Napisany przez: nospor 11.09.2015, 13:41:03

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.

Napisany przez: mar1aczi 11.09.2015, 13:41:47

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.

Napisany przez: peklo 11.09.2015, 13:47:03

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

Napisany przez: 8_pasarzer_NOSTROMO 2.12.2019, 14:12:36

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=http://www.php.net/strtotime($a);
  9. $b1=http://www.php.net/strtotime($b);
  10. $sum=$a1+$b1;
  11.  
  12. http://www.php.net/echo $suma=http://www.php.net/date('H:i:s', $sum); // 10:30:00 questionmark.gif? why


Napisany przez: nospor 2.12.2019, 14:24:09

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.

Napisany przez: 8_pasarzer_NOSTROMO 2.12.2019, 14:31:12

być może zmylił mnie wynik bliski prawdzie. Ciągle uciekała mi 1 godzina. A czy jest prostszy sposób niż explode ?

Napisany przez: nospor 2.12.2019, 14:33:11

A coz skomplikowanego jest w explode po dwukropku?

Napisany przez: 8_pasarzer_NOSTROMO 2.12.2019, 14:34:40

myślałem że jest jakaś funkcja która to zsumuje bez rozbijania. Dobra poradzę sobie jeśli takiej nie ma.

Napisany przez: Tomplus 3.12.2019, 09:05:49

Był już kiedyś podobny wątek:
http://forum.php.pl/lofiversion/index.php/t187747.html

Napisany przez: 8_pasarzer_NOSTROMO 3.12.2019, 09:30:44

@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.

Napisany przez: nospor 3.12.2019, 09:49:33

@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 :/

Napisany przez: 8_pasarzer_NOSTROMO 3.12.2019, 12:46:50

@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.

Napisany przez: nospor 3.12.2019, 12:48:29

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

Napisany przez: Tomplus 3.12.2019, 18:50:28

@Nospor
Wróżka programuszka biggrin.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)