/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[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

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste