|
| [MySQL] Avanceret dato udtræk? Fra : Kjeld |
Dato : 08-10-08 14:58 |
|
Jeg er ved at lave noget tidsregistrering til mig selv og har følgende
fiktive liste:
Dag, Dato, Tid, Type
[CUT]
sat, 2008-09-27, 09, login
sat, 2008-09-27, 17, logoff
sun, 2008-09-28, 22, login (*1)
mon, 2008-09-29, 00, vacation (*1)
mon, 2008-09-29, 02, logoff (*1)
mon, 2008-09-29, 09, login
mon, 2008-09-29, 17, logoff
tue, 2008-09-30, 09, login
tue 2008-09-30, 17, logoff
wed, 2008-10-01, 00, sick
thu, 2008-10-02, 09, login
thu, 2008-10-03, 17, logoff
sun, 2008-10-05, 23, login (*2)
mon, 2008-10-06, 00, vacation (*2)
mon, 2008-10-06, 02, logoff (*2)
[CUT]
Jeg tror I kan se idéen med min liste ud fra disse rækker.
*1 = skiftet fra én uge til en anden, hvor den første type i den nye uge er
"vacation" mens nummer to er "logoff".
*2 = skiftet fra én uge til en anden, hvor den sidste type ugen er "login"
mens de to første i næste uge er "vacation" og "logoff".
Dét som jeg gerne vil frem til er, at få følgende liste frem (mellem start
og slut):
Dag, Dato, Tid, Type
[CUT]
sat, 2008-09-27, 09, login
sat, 2008-09-27, 17, logoff
sun, 2008-09-28, 22, login (*1)
mon, 2008-09-29, 02, logoff (*1)
---[START]---
mon, 2008-09-29, 00, vacation (*1)
mon, 2008-09-29, 09, login
mon, 2008-09-29, 17, logoff
tue, 2008-09-30, 09, login
tue 2008-09-30, 17, logoff
wed, 2008-10-01, 00, sick
thu, 2008-10-02, 09, login
thu, 2008-10-03, 17, logoff
sun, 2008-10-05, 23, login (*2)
mon, 2008-10-06, 02, logoff (*2)
---[SLUT]---
mon, 2008-10-06, 00, vacation (*2)
[CUT]
Dette udtræk er i hvert fald hvad der er relevant for én uge.
Jeg håber I forstår hvad jeg mener. Spørgsmålet er bare om det kan laves i
MySQL uden at blive alt for kompliceret. Sproget bagved er PHP, så det kunne
jo også laves dér, men det mest elegante, synes jeg, ville være at få det
korrekte udtræk fra databasen istedet for at udregne på det efterfølgende.
Alternativt må I gerne komme med andre forslag til hvordan det kan gøres, da
jeg sagtens kan lave noget nyt. Dette var bare lige hvad jeg synes kunne
være smart, så man godt kunne arbejde selv om man havde en fridag osv (omend
det gør man selvfølgelug ikke)
| |
Kjeld (09-10-2008)
| Kommentar Fra : Kjeld |
Dato : 09-10-08 12:49 |
|
Er der slet ingen bud til denne?
| |
Lars Kongshøj (09-10-2008)
| Kommentar Fra : Lars Kongshøj |
Dato : 09-10-08 13:44 |
|
Kjeld wrote:
> Er der slet ingen bud til denne?
Mit umiddelbare bud er at udtrække data og efterbehandle dem proceduralt.
--
Lars Kongshøj
Oracle- og Unix-konsulent søger opgaver
http://www.kongshoj.com
| |
Kim Bach Petersen (12-10-2008)
| Kommentar Fra : Kim Bach Petersen |
Dato : 12-10-08 10:33 |
|
Kjeld skrev:
> Er der slet ingen bud til denne?
>
> Dag, Dato, Tid, Type
> ---[START]---
> mon, 2008-09-29, 00, vacation (*1)
> mon, 2008-09-29, 09, login
> mon, 2008-09-29, 17, logoff
> tue, 2008-09-30, 09, login
> tue 2008-09-30, 17, logoff
> wed, 2008-10-01, 00, sick
> thu, 2008-10-02, 09, login
> thu, 2008-10-03, 17, logoff
> sun, 2008-10-05, 23, login (*2)
> mon, 2008-10-06, 02, logoff (*2)
> ---[SLUT]---
For mig at se har du gjort det enkelt ved at sætte tidsstemplet for
ferie og sygdom til "00" - du kan derfor bare sortere efter dato og tid:
SELECT * FROM t ORDER BY dato,tid
Kim
| |
Kjeld (13-10-2008)
| Kommentar Fra : Kjeld |
Dato : 13-10-08 12:25 |
|
>> Er der slet ingen bud til denne?
> >
> > Dag, Dato, Tid, Type
> > ---[START]---
> > mon, 2008-09-29, 00, vacation (*1)
> > mon, 2008-09-29, 09, login
> > mon, 2008-09-29, 17, logoff
> > tue, 2008-09-30, 09, login
> > tue 2008-09-30, 17, logoff
> > wed, 2008-10-01, 00, sick
> > thu, 2008-10-02, 09, login
> > thu, 2008-10-03, 17, logoff
> > sun, 2008-10-05, 23, login (*2)
> > mon, 2008-10-06, 02, logoff (*2)
> > ---[SLUT]---
>
> For mig at se har du gjort det enkelt ved at sætte tidsstemplet for ferie
> og sygdom til "00" - du kan derfor bare sortere efter dato og tid:
>
> SELECT * FROM t ORDER BY dato,tid
Det er jo netop dét jeg har gjort i nedenstående og det er ikke løsningen,
da jeg ikke får den samhørighed der er ved login-logoff :
> Dag, Dato, Tid, Type
> [CUT]
> sat, 2008-09-27, 09, login
> sat, 2008-09-27, 17, logoff
> sun, 2008-09-28, 22, login (*1)
> mon, 2008-09-29, 00, vacation (*1)
> mon, 2008-09-29, 02, logoff (*1)
> mon, 2008-09-29, 09, login
> mon, 2008-09-29, 17, logoff
> tue, 2008-09-30, 09, login
> tue 2008-09-30, 17, logoff
> wed, 2008-10-01, 00, sick
> thu, 2008-10-02, 09, login
> thu, 2008-10-03, 17, logoff
> sun, 2008-10-05, 23, login (*2)
> mon, 2008-10-06, 00, vacation (*2)
> mon, 2008-10-06, 02, logoff (*2)
> [CUT]
Men som Lars skrev, så er det nok nemmest at arbejde på data i PHP fremfor
at lave noget vildt avanceret i MySQL.
| |
Kim Bach Petersen (13-10-2008)
| Kommentar Fra : Kim Bach Petersen |
Dato : 13-10-08 15:52 |
|
Kjeld skrev:
>> For mig at se har du gjort det enkelt ved at sætte tidsstemplet for ferie
>> og sygdom til "00" - du kan derfor bare sortere efter dato og tid:
>>
>> SELECT * FROM t ORDER BY dato,tid
>
> Det er jo netop dét jeg har gjort i nedenstående og det er ikke løsningen,
> da jeg ikke får den samhørighed der er ved login-logoff :
Ah, jeg havde misforstået, men samme princip kan faktisk godt bruges,
fordi dine værdier for kolonnen Type faktisk opfører sig interessant,
hvis man sorterer dem alfabetisk:
login
logout
sick
vacation
Så ved blot at sorterer på Type sikrer du dig, at logout altid følger
login - og godt nok kommer sick/vacation så efter (og ikke før som
ønsket), men altid forudsigeligt samme sted.
SELECT * FROM t ORDER BY dato,type[,tid]
Alternativt kan du faktisk lægge en CASE ind i din SELECT, som laver
præcis den sorteringsrækkefølge, som du ønsker
SELECT dag,dato,tid,type,CASE type WHEN 'sick' THEN 0 WHEN 'vacation'
THEN 0 ELSE 1 END AS sortorder FROM t ORDER BY dato,sortorder
Kim
| |
|
|