Gå til innhold

Tid pr time


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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 av luxus
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...