witam
Mam takie oto zapytanie, które wyswietla mi nadgodziny dla danego pracownika
SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny FROM karta kar INNER JOIN karta_s ser ON kar.id=ser.id_karta INNER JOIN user us ON us.id=ser.us WHERE us.id=:id
Trzeba skonwertować na sekundy, zsumować i skonwertować z powrotem na godziny:
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny FROM karta kar INNER JOIN karta_s ser ON kar.id=ser.id_karta INNER JOIN user us ON us.id=ser.us WHERE us.id=:id
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
A może trzeba to rozbić na dwa zapytania
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ę:
Ostatni wiersz wyniku będzie sumą nadgodzin.
SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny FROM karta kar INNER JOIN karta_s ser ON kar.id=ser.id_karta INNER JOIN user us ON us.id=ser.us WHERE us.id=:id UNION SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny FROM karta kar INNER JOIN karta_s ser ON kar.id=ser.id_karta INNER JOIN user us ON us.id=ser.us WHERE us.id=:id
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
próbowałem ale głupoty wychodzą
No przeciez... naprawde nie widzisz ze masz blad w linii 3 swojego kodu? Zamiast xxx masz wstawic yyy
Przenosze
jakie xxx jakie yyy?
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...
nie bo teraz skupiam się na czymś innym ,a to tak przy okazji
Kod wygląda mniej więcej tak
try { $sql = "SELECT TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') AS nadgodziny, kar.id karid,ser.id serid FROM karta kar INNER JOIN karta_s ser on kar.id=ser.id_karta INNER JOIN user us on us.id=ser.us WHERE us.id=:id and ser.godz_powr>:godz_powr UNION ALL SELECT SEC_TO_TIME(SUM(TIME_TO_SEC( TIMEDIFF( TIMEDIFF(ser.godz_powr, ser.rozp_pracy), '08:00') ))) AS nadgodziny, kar.id karid,ser.id serid FROM karta kar INNER JOIN karta_s ser on kar.id=ser.id_karta INNER JOIN user us on us.id=ser.us WHERE us.id=:id and ser.godz_powr>:godz_powr"; $stmt = $pdo->prepare( $sql ); $stmt -> bindValue(':godz_powr','16:00:00', PDO::PARAM_STR); $stmt -> bindValue(':id',$id, PDO::PARAM_INT); $stmt -> execute(); $dan = http://www.php.net/array(); while($row = $stmt -> fetch()) { $karid = $row['karid']; if (!http://www.php.net/isset($dan[$karid])) $dan[$karid] = http://www.php.net/array('serwisant'=>array() ); if (!http://www.php.net/empty($row['serid'])) $dan[$karid]['serwisant'][$row['serid']]= http://www.php.net/array('nadgodziny'=> $row['nadgodziny'] ); } foreach ($dan as $id_og => $rows) { foreach ($rows['serwisant'] as $serw) { http://www.php.net/echo http://www.php.net/date("G:i",http://www.php.net/strtotime($serw['nadgodziny']) ); } } $stmt->closeCursor(); } catch(PDOException $e) { http://www.php.net/echo 'error'; }
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
robiłem coś s stylu "$suma+=$godzina;" i głupoty mi wychodziły
Dlatego juz dawno temu w tym temacie pisalem ci, bys podal kod, jak to robiles. Ale widze po chinsku pisze.
wiem wiem że pisałeś ale z tym próbowałem wczoraj i dałem sobie spokój, a miałem coś takiego:
$suma+=http://www.php.net/date("G:i:s",http://www.php.net/strtotime($serw['nadgodziny']) ); http://www.php.net/echo $suma;
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.
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.
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
Witam
Podpowie ktoś jak szybko zsumować 2 godziny.
07:30:00 + 04:00:00 = 11:30:00 Robię tak i ciagle wychodzi mi 10:30:00 $a=07:30:00 $b=04:00:00 $a1=http://www.php.net/strtotime($a); $b1=http://www.php.net/strtotime($b); $sum=$a1+$b1; http://www.php.net/echo $suma=http://www.php.net/date('H:i:s', $sum); // 10:30:00 ? why
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.
być może zmylił mnie wynik bliski prawdzie. Ciągle uciekała mi 1 godzina. A czy jest prostszy sposób niż explode ?
A coz skomplikowanego jest w explode po dwukropku?
myślałem że jest jakaś funkcja która to zsumuje bez rozbijania. Dobra poradzę sobie jeśli takiej nie ma.
Był już kiedyś podobny wątek:
http://forum.php.pl/lofiversion/index.php/t187747.html
@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.
@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 :/
@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.
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
@Nospor
Wróżka programuszka
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)