ďťż
 
Obliczanie czasu (PHP+MYSQL) ďťż
 
Obliczanie czasu (PHP+MYSQL)
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

Obliczanie czasu (PHP+MYSQL)



Marcin Wasilewski - 11-01-2006 09:08
Obliczanie czasu (PHP+MYSQL)
  Witam,

mam pytanie dotyczace obliczania czasu w bazie danych MySql.
Dostep do bazy odbywa sie przez PHP

Tabela zawiera m.in. takie pola:
| Id | int(10) | | PRI | NULL | auto_increment |
| Data | date | | | 0000-00-00 | |
| Godzina | time | | | 00:00:00 | |

w ktorych trzymane sa dane jak te:
| 2313 | 2006-01-02 | 08:07:08 |
| 2545 | 2006-01-02 | 16:27:50 |
| 2730 | 2006-01-03 | 08:24:07 |
| 2915 | 2006-01-03 | 16:22:21 |

dane te to godzina wejscia np. do budynku i wyjscia.
jak Waszym zdaniem najlepiej obliczyc czas przebywania w budynku w godzinch
kolejno w dniach.

zastanawialem sie nad funkcja: timediff
(http://dev.mysql.com/doc/refman/4.1/...unctions.html), ale w
moim przypadku godziny sa zapisane w roznych rekordach.
Zeby sytuacja nie byla zbyt latwa, to moze sie zdarzyc, ze ktos kilka razy
wchodzi i wychodzi z budynku.

Macie moze jakies propozycje, jak to ugryzc?
Z gory dziekuje i pozdrawiam,
Marcin





wistocie - 11-01-2006 09:08

 
Użytkownik "Marcin Wasilewski" <marcinwasilewski@poczta.onet.pl> napisał w
wiadomości news:dptrhn$los$1@news.isp.telenergo.pl...
> Witam,
>
> mam pytanie dotyczace obliczania czasu w bazie danych MySql.
> Dostep do bazy odbywa sie przez PHP
>
> Tabela zawiera m.in. takie pola:
> | Id | int(10) | | PRI | NULL | auto_increment |
> | Data | date | | | 0000-00-00 | |
> | Godzina | time | | | 00:00:00 | |
>
> w ktorych trzymane sa dane jak te:
> | 2313 | 2006-01-02 | 08:07:08 |
> | 2545 | 2006-01-02 | 16:27:50 |
> | 2730 | 2006-01-03 | 08:24:07 |
> | 2915 | 2006-01-03 | 16:22:21 |
>
> dane te to godzina wejscia np. do budynku i wyjscia.
> jak Waszym zdaniem najlepiej obliczyc czas przebywania w budynku w
godzinch
> kolejno w dniach.
>
> zastanawialem sie nad funkcja: timediff
> (http://dev.mysql.com/doc/refman/4.1/...unctions.html), ale
w
> moim przypadku godziny sa zapisane w roznych rekordach.
> Zeby sytuacja nie byla zbyt latwa, to moze sie zdarzyc, ze ktos kilka razy
> wchodzi i wychodzi z budynku.
>
> Macie moze jakies propozycje, jak to ugryzc?
> Z gory dziekuje i pozdrawiam,
> Marcin
>
Przy zalozeniu ze id wyroznia osobe

select data, id,
min(godzina) wszedl ,
max(godzina) wyszedl,
timediff(max(godzina) -min(godzina) ) czas_pracy
from TwojaTabela
group by data,id
order by data

Mozesz dodatkowo zalozyc w warunku where parametr np. dzien lub id jakiegos
usera.
Oczywiscie musisz wziasc poprawke przypadek kiedy sie lamie dzien tzn ktos
siedzi od 22 do 01 w nocy -wiec bedzie 2 godziny jednego dnia i jedna
nastepnego, czego statystyki dzienne nie uwzgledniaja.

wistocie




jerzy - 11-01-2006 09:08

 
>>
>>dane te to godzina wejscia np. do budynku i wyjscia.
>>jak Waszym zdaniem najlepiej obliczyc czas przebywania w budynku w
>
> godzinch
>
>>kolejno w dniach.
>>
>>zastanawialem sie nad funkcja: timediff
>>(http://dev.mysql.com/doc/refman/4.1/...unctions.html), ale
>
> w
>
>>moim przypadku godziny sa zapisane w roznych rekordach.
>>Zeby sytuacja nie byla zbyt latwa, to moze sie zdarzyc, ze ktos kilka razy
>>wchodzi i wychodzi z budynku.
>>
>>Macie moze jakies propozycje, jak to ugryzc?
>>Z gory dziekuje i pozdrawiam,
>>Marcin
>>
>
> Przy zalozeniu ze id wyroznia osobe
>
> select data, id,
> min(godzina) wszedl ,
> max(godzina) wyszedl,
> timediff(max(godzina) -min(godzina) ) czas_pracy
> from TwojaTabela
> group by data,id
> order by data
>
> Mozesz dodatkowo zalozyc w warunku where parametr np. dzien lub id jakiegos
> usera.
> Oczywiscie musisz wziasc poprawke przypadek kiedy sie lamie dzien tzn ktos
> siedzi od 22 do 01 w nocy -wiec bedzie 2 godziny jednego dnia i jedna
> nastepnego, czego statystyki dzienne nie uwzgledniaja.
>
> wistocie
>
>
hm, a co jeśli "robaczek" się nie zamelduje albo nie wymelduje?
czym będzie wtedy min(godzina) max(godzina)?
podliczysz go że był od np 7:00 nie wymeldował się o 15 więc następny
rekord będzie około 7
A może dwie tabelki wejście i oddzielnie wyjście?
pozdr
Jerzy




wistocie - 11-01-2006 09:08

 
Użytkownik "jerzy" <j_@gazeta.pl> napisał w wiadomości
news:dpugn1$eig$1@inews.gazeta.pl...
>>
> hm, a co jeśli "robaczek" się nie zamelduje albo nie wymelduje?

Na takie robaczki nie ma rady, oprocz ostrej dyscypliny Pani kadrowej §:-)

> czym będzie wtedy min(godzina) max(godzina)?
> podliczysz go że był od np 7:00 nie wymeldował się o 15 więc następny
> rekord będzie około 7
Pytanie dla dobrej wrozki - No to ile on byl tak naprawde w tej pracy ?
To jest uproszczone podejscie i zlicza czas tylko w ramach jednego dnia,
dla grzecznych pracownikow od 7:00 powiedzmy do 15:30 i od 14:00 do 22:00
i przy zalozeniu ze nie rozrozniamy wejsc, wyjsc

> A może dwie tabelki wejście i oddzielnie wyjście?

Ale masz racje, jedna rzecz pominieta, w tym rownaniu powinien byl znalezc
sie dodatkowy parametr
aby odrozniac wejscia od wyjsc. Czasem sie przydaje hehe.
Nie potrzebne dwie tabelki wystarczy jedna i dodatkowe pole [EVENT in
('IN','OUT')]
Ale zmieni sie troche zapytanie, a to juz chyba nie jest zadanie dla nas,
lecz dla autora tej bajeczki.

> pozdr
> Jerzy

wistocie i ja.





Marcin Wasilewski - 11-01-2006 09:10

  Witam i dziekuje za pomoc.
w zasadzie to mam jeszcze jedno pole identyfikujace uzytkownika oraz jedno
pole, w ktorym slownie jest zapisywany typ wejscie/wyjscie.
Zapytanie:
select data, id_usera,
min(godzina) wszedl ,
max(godzina) wyszedl,
timediff(max(godzina) -min(godzina) ) czas_pracy
from TwojaTabela
group by data,id_usera
order by data

jest teoretycznie dobre przy zalozeniu, ze tak jak pisaliscie, ktos
przyszedl np. o 8 i wyszedl o 16.
Jesli nie odbije karty wychodzac, wowczas jego czas pracy bedzie wynosil 0
godz. i bedzie musial wprowadzic recznie informacje o godzinie wyjscia, ale
wtedy do bazy trafi rowniez info, ze zostalo to wpisane, a nie przyszlo z
czytnika. To zrobie juz sobie spokojnie w php.
Bardziej zastanawialo mnie od poczatku jak zalatwic kwestie tego, ze ktos
moze w ciagu dnia np. dwa razy przychodzic i wychodzic. Wtedy max-min nie
uwzgledni tego jednego wyjscia w ciagu dnia.

Pozdrawiam,
Marcin

Użytkownik "wistocie" <wistocie_wytnijsprawe@wp.pl> napisał w wiadomości
news:43c2f38c$0$17944$f69f905@mamut2.aster.pl...
>
> Użytkownik "jerzy" <j_@gazeta.pl> napisał w wiadomości
> news:dpugn1$eig$1@inews.gazeta.pl...
>>>
>> hm, a co jeśli "robaczek" się nie zamelduje albo nie wymelduje?
>
> Na takie robaczki nie ma rady, oprocz ostrej dyscypliny Pani kadrowej §:-)
>
>> czym będzie wtedy min(godzina) max(godzina)?
>> podliczysz go że był od np 7:00 nie wymeldował się o 15 więc następny
>> rekord będzie około 7
> Pytanie dla dobrej wrozki - No to ile on byl tak naprawde w tej pracy ?
> To jest uproszczone podejscie i zlicza czas tylko w ramach jednego dnia,
> dla grzecznych pracownikow od 7:00 powiedzmy do 15:30 i od 14:00 do 22:00
> i przy zalozeniu ze nie rozrozniamy wejsc, wyjsc
>
>> A może dwie tabelki wejście i oddzielnie wyjście?
>
> Ale masz racje, jedna rzecz pominieta, w tym rownaniu powinien byl znalezc
> sie dodatkowy parametr
> aby odrozniac wejscia od wyjsc. Czasem sie przydaje hehe.
> Nie potrzebne dwie tabelki wystarczy jedna i dodatkowe pole [EVENT in
> ('IN','OUT')]
> Ale zmieni sie troche zapytanie, a to juz chyba nie jest zadanie dla nas,
> lecz dla autora tej bajeczki.
>
>> pozdr
>> Jerzy
>
> wistocie i ja.
>




Sergiusz Rozanski - 11-01-2006 09:10

  Dnia 10.01.2006 Marcin Wasilewski <marcinwasilewski@poczta.onet.pl> napisał/a:
> Bardziej zastanawialo mnie od poczatku jak zalatwic kwestie tego, ze ktos
> moze w ciagu dnia np. dwa razy przychodzic i wychodzic. Wtedy max-min nie
> uwzgledni tego jednego wyjscia w ciagu dnia.

bo wejscie i wyjscie powinieneś traktować jak jedno zdarzenie, czyli
trzymać w 1 rekordzie 2 timestampy wejścia i wyjścia.
Zapomnienie wpisu powoduje brak elementu i wymaga korekty ręcznej.

Czyli dostaniesz:
we: 7:00 wy: 15:00
we: 7:00 wy: null (zapomniał odbić przy wychodzeniu)
we: null wy: 15:00 (zapomniał odbić przy wejściu)

wyjście w trakcie pracy:
we: 7:00 wy: 11:00
we: 12:15 wy: 15:00

teraz obliczenie czasu pracy to banał bo to różnica w obrębie rekordu,
więc np suma w obrębie tygodnia czy miesiąca też łatwa do uzyskania.
Imo tak powinieneś wypełnić baze z logu rejestratora.

--
*** rozanski.at.sergiusz.dot.com sq3bkn ***
*** http://jeep.comm.pl ***
*** rtg project http://gg.overwap.net ***




Marcin Wasilewski - 11-01-2006 09:10

  Użytkownik "Sergiusz Rozanski" <write-only-with-spf@sergiusz.com> napisał w
wiadomości news:slrnds7d8b.37i.write-only-with-spf@dns.media-lab.com.pl...
> Dnia 10.01.2006 Marcin Wasilewski <marcinwasilewski@poczta.onet.pl>
> napisał/a:
>> Bardziej zastanawialo mnie od poczatku jak zalatwic kwestie tego, ze ktos
>> moze w ciagu dnia np. dwa razy przychodzic i wychodzic. Wtedy max-min nie
>> uwzgledni tego jednego wyjscia w ciagu dnia.
>
> bo wejscie i wyjscie powinieneś traktować jak jedno zdarzenie, czyli
> trzymać w 1 rekordzie 2 timestampy wejścia i wyjścia.
> Zapomnienie wpisu powoduje brak elementu i wymaga korekty ręcznej.
>
> Czyli dostaniesz:
> we: 7:00 wy: 15:00
> we: 7:00 wy: null (zapomniał odbić przy wychodzeniu)
> we: null wy: 15:00 (zapomniał odbić przy wejściu)
>
> wyjście w trakcie pracy:
> we: 7:00 wy: 11:00
> we: 12:15 wy: 15:00
>
> teraz obliczenie czasu pracy to banał bo to różnica w obrębie rekordu,
> więc np suma w obrębie tygodnia czy miesiąca też łatwa do uzyskania.
> Imo tak powinieneś wypełnić baze z logu rejestratora.
>
> --
> *** rozanski.at.sergiusz.dot.com sq3bkn ***
> *** http://jeep.comm.pl ***
> *** rtg project http://gg.overwap.net ***

Niestety jest to dosc trudne do uzyskania, bo dane czytniki wystawiają na
ftp w formie pliku tekstowego.
W pliku jedna linija to jedno zdarzenie, np. 1. wejscie, 2 wejscie kogos
innego, 3. wyjscie itp.
Pobieram ten plik, a nastepnie przy pomocy mysqlimport laduje go do tabeli.
Dlatego juz w pierwszym mailu pisalem,ze niestety dane odnosnie wejscia i
wyjscia sa w roznych rekordach.
Coraz bardziej zastanawiam sie czy nie przeniesc przeliczania na php.
Byloby to chyba tez dosyc proste do zrobienia, ale w sql jest zawsze troche
szybciej.

pozdr
Marcin




Sergiusz Rozanski - 11-01-2006 09:11

  Dnia 10.01.2006 Marcin Wasilewski <marcinwasilewski@poczta.onet.pl> napisał/a:
> Niestety jest to dosc trudne do uzyskania, bo dane czytniki wystawiają na
> ftp w formie pliku tekstowego.
> W pliku jedna linija to jedno zdarzenie, np. 1. wejscie, 2 wejscie kogos
> innego, 3. wyjscie itp.

sparować samemu.
Każde wejście tworzy nowy rekord, każde wyjście uzupełnia ostatnie wejście,
jeśli są 2 wyjścia pod rząd to drugie wyjście tworzy nowy rekord z pustym
wejściem (do korekty).

> Pobieram ten plik, a nastepnie przy pomocy mysqlimport laduje go do tabeli.
> Dlatego juz w pierwszym mailu pisalem,ze niestety dane odnosnie wejscia i
> wyjscia sa w roznych rekordach.

proponuję to zmienić. olać mysqlimport, napisać swój, mądry uploader do danych.

> Coraz bardziej zastanawiam sie czy nie przeniesc przeliczania na php.
> Byloby to chyba tez dosyc proste do zrobienia, ale w sql jest zawsze troche
> szybciej.

licz w sql, oczywiście że szybciej.

--
*** rozanski.at.sergiusz.dot.com sq3bkn ***
*** http://jeep.comm.pl ***
*** rtg project http://gg.overwap.net ***
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    [mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?= [mysql] =?ISO-8859-2?Q?wielko=B6=E6_bazy_a_stabilno=B6=E6=2C?==?ISO-8859-2?Q?_podzia=B3_du=BFej_bazy_a_powi=B1zania_tabel?= [MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?= [mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?= [MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?= [MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?= Gdzie MySQL 4.1, a gdzie 5.0? [MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?= [MS SQL] "set names" (mySQL) w MS SQL [mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • lubiatowo.xlx.pl
  • Cytat

    Decede mihi sole - nie zasłaniaj mi słonca.
    Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści
    Hoc fac - tak czyń.
    A tergo - od tyłu; z tyłu.
    I czarne włosy posiwieją. Safona

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com