Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Ewidencja czasu pracy na podstawie wejść i wyjść do budynku
staryhaliny
post 14.03.2011, 15:09:37
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 14.03.2011

Ostrzeżenie: (0%)
-----


Witam.

Zmagam się z problemem wyliczenia ilości czasu, w którym pracownik znajduje się w budynku.
Excel z całym dobrodziejstwem tabel przestawnych nie daje rady.
Próbuje więc to rozegrać za pomoca SQLa (MySQL).

Dane w tabela wyglądają m/w tak:

nazwisko | imie | bramka | data | godzina
Kowalski | Jan | WEJSCIE | 2011-02-02 | 07:30:20
Kowalski | Jan | WYJSCIE | 2011-02-02 | 09:22:23
Kowalski | Jan | WEJSCIE | 2011-02-02 | 09:35:43
Kowalski | Jan | WYJSCIE | 2011-02-02 | 16:12:15
Nowak | Marek | WEJSCIE | 2011-02-02 | 09:20:23
Nowak | Marek | WYJSCIE | 2011-02-02 | 17:30:12
Kowalski | Jan | WEJSCIE | 2011-02-03 | 07:29:32
Kowalski | Jan | WYJSCIE | 2011-02-03 | 09:23:33
itd.


Wszystko by było w porządku, gdyby ludzie przychodzili do pracy i wychodzili po jej skończeniu:

  1. SELECT nazwisko, imie, bramka, DATA TIME_FORMAT(TIMEDIFF(MAX(godzina),MIN(godzina)), '%H:%i') AS czas_pracy FROM `tab` GROUP BY nazwisko, DATA


ale nie... oni muszą jeszcze wyłazić w ciągu dnia na papieroski i w innych celach wink.gif

Stąd prośba o pomoc, jak skontruował zapytanie aby można było wyliczyć tzw. efektywny czas pracy, czyli ten okres kiedy pracownik faktycznie przebywa w budynku.

Efektem końcowym mogła by być taka tabela:

nazwisko | imie | data | czas_pracy
Kowalski | Jan | 2011-02-02 | 08:30
Kowalski | Jan | 2011-02-03 | 07:40
Nowak | Marek | 2011-02-02 | 08:10


Jeśli ktoś ma pomysł na inne niż SQLowe rozwiązanie tego problemu, to też chętnie się dowiem.

Z gory dziękuję za wszelkie sugestie.
Go to the top of the page
+Quote Post
Noidea
post 14.03.2011, 19:20:18
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

Ostrzeżenie: (0%)
-----


SQLowe rozwiązanie to na przykład może być policzenie sumy godzin wyjść i odjęcie od tego sumy godzin wejść każdego dnia, dla każdego pracownika. Wygląda to tak:

  1. SELECT wy.nazwisko, wy.imie, wy.`data`, SEC_TO_TIME( wy.suma_wyjsc - we.suma_wejsc ) AS czas
  2. FROM (
  3. SELECT nazwisko, imie, `data`, SUM( TIME_TO_SEC( godzina ) ) AS suma_wyjsc
  4. FROM test
  5. WHERE bramka = 'WYJSCIE'
  6. GROUP BY nazwisko, imie, `data`
  7. ) wy
  8. JOIN (
  9. SELECT nazwisko, imie, `data`, SUM( TIME_TO_SEC( godzina ) ) AS suma_wejsc
  10. FROM test
  11. WHERE bramka = 'WEJSCIE'
  12. GROUP BY nazwisko, imie, `data`
  13. ) we ON ( wy.nazwisko = we.nazwisko AND wy.imie = we.imie AND wy.`data` = we.`data` )

Tyle że jak będziesz chciał jeszcze uwzględnić pracowników, którzy weszli, ale jeszcze nie zdążyli wyjść, albo takich, którzy zostali w pracy do północy, to skończysz z zapytaniem na 100 linijek smile.gif


Prostsze rozwiązanie to pobranie danych z bazy posortowanych po nazwisku, imieniu dacie i godzinie i sumowanie w pętli różnic czasów dwóch kolejnych wierszy.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 2.05.2025 - 06:29