| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | [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   
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |