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.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[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.pldoc.pisz.plpdf.pisz.pllubiatowo.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 |
|