Teobald Skrevet 3. oktober 2008 Del Skrevet 3. oktober 2008 Jeg skal regne ut forbruk av tid pr time og lurer på om noen har mulighet til å hjelpe meg litt med dette.. Har i database: starttid | stopptid | minutter Eks.: start kl.: 01:30:00 | stopp kl.: 03:15:00 | minutter: 105 start kl.: 01:50:00 | stopp kl.: 02:10:00 | minutter: 20 Ønsket resultat er noe slik: $time00 = 0; $time01 = 40; $time02 = 70; $time03 = 15; $time04 = 0; osv Noen som har en ide om hvordan jeg kan få ut det jeg ønsker meg her? Lenke til kommentar
Ekko Skrevet 3. oktober 2008 Del Skrevet 3. oktober 2008 Regner med du kan gjøre datatypen i kolonnen om til time om du ikke har gjort det alt. Litt pseudokode: For hver time "i" gjør et søk: Where starttid<i+60min and stopptid>i Da vil du få alle linjene som omhandler timen du holder på å behandle For hver linje må du så finne ut hvor mye tid som er innenfor den timen du holder på med. my_starttid=starttid my_stopptid=stopptid if my_starttid<i then my_starttid=i if my_stopptid>i+60 then my_stopptid=i+60 totalt for time i =+ my_stopptid-my-starttid Lenke til kommentar
JohndoeMAKT Skrevet 3. oktober 2008 Del Skrevet 3. oktober 2008 Det er ingen vits å lagre "minutter" i databasen siden du allerede lagrer start og slutt. Og som Ekko skriver må du bruke datatype i databasen for time. psudocode: hours = array with length 24 and defaulted to zero for i = 1 -> 24 foreach registerwhatever if start less than now if end less than or equals now add all of register to this hour remove register else add removed interval to this hour move start to now [end psudocode] Men siden jeg likevel har så god tid til banen går skrev jeg det i full fart, og koden er helt utestet. $sql = "SELECT TIME_TO_SEC( start ) AS start, TIME_TO_SEC( end ) AS end FROM registrations;"; $registrations = mysql_whatever( $sql ); $hours = array_fill( 0, 24, 0 ); for ( $i = 0; i < 24; i++ ) { $timeHourEnd = ( $i + 1 ) * 86400 ); foreach( $registrations as &$registration ) { if ( $registration['start'] < $timeHourEnd ) { if ( $registration['end'] <= $timeHourEnd ) { $hours[$i] += $registration['end'] - $registration['start']; unset( $registration ); } else { $hours[$i] += $timeHourEnd - $registration['start']; $registration['start'] = $timeHourEnd; } } } } Lenke til kommentar
luxus Skrevet 5. oktober 2008 Del Skrevet 5. oktober 2008 (endret) Jeg syntes dette var en morsom problemstilling å bryne seg på om man skulle løse dette bare ved hjelp av SQL. Jeg har satt opp følgende: 2 tabeller settes opp: Den ene beskriver din starttid og stopptid som normalt: SELECT intervall_start, intervall_stopp, FORMAT(sekunder_i_intervall / 60, 1) AS minutter, SEC_TO_TIME(sekunder_i_intervall) AS minutter_som_tid FROM ( -- Denne sub-queryen henter ut alle rader der fra-tidspunktet er før -- intervall_stopp, og til-tidspunktet er etter intervall_start. -- Alle rader vil da høyst sannsynlig inneholde endel "ekstra" tid rundt intervallet, -- som blir fjernet av SUBTIME hvis dette er tilfellet. SELECT i.*, t.*, SUM(TIME_TO_SEC(SUBTIME( SUBTIME( SUBTIME(til, fra), -- total lengde IF(TIME_TO_SEC(SUBTIME(intervall_start, fra)) > 0, SUBTIME(intervall_start, fra), 0) -- trekk fra tiden FØR intervall_start ), IF(TIME_TO_SEC(SUBTIME(til, intervall_stopp)) > 0, SUBTIME(til, intervall_stopp), 0) -- treffer fra tiden ETTER intervall_stopp ))) AS sekunder_i_intervall FROM tider t INNER JOIN tidsintervall i WHERE fra < intervall_stopp AND til > intervall_start GROUP BY intervall_start, intervall_stopp ) AS tidsintervall ORDER BY intervall_start Resultatet av den query-en blir: intervall_start | intervall_stopp | minutter | minutter_som_tid ------------------------------------------------------------------- 01:00:00 | 02:00:00 | 40.0 | 00:40:00 02:00:00 | 03:00:00 | 70.0 | 01:10:00 03:00:00 | 04:00:00 | 15.0 | 00:15:00 ...om SQL query-en min kunne vært satt opp noe smartere enn det den er gjort kan jo tenkes, men radene som kommer ut er vel ønsket resultat :-) Endret 5. oktober 2008 av luxus Lenke til kommentar
Teobald Skrevet 10. oktober 2008 Forfatter Del Skrevet 10. oktober 2008 (endret) Tusen takk for hjelpen =) Endret 10. oktober 2008 av Teobald Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå