2017-08-30 3 views
0

Ich habe eine Datenbanktabelle volle Zeitaufzeichnungen und ich brauche die Menge der Stunden zu berechnen, die zwischen ihnen bestehenden ...Time Aufzeichnung Berechnungen in PHP

Ein Rekord hat die folgenden Felder: 'created' (dh 2017: 08:30 11:15:00) und 'direction' (dh 1 steht für "clock in" und "0" für "clock out"). Also muss ich ein Start- und Enddatum festlegen, dann alle Zeitdatensätze innerhalb dieses Zeitrahmens auswählen und die Anzahl der geleisteten Stunden berechnen (die Anzahl der Stunden, die zwischen den Datensätzen direction=0 und direction=1 liegen).

Irgendeine Idee, wie man die Logik dafür herstellt? Das Ergebnis muss ein Maß für "Stunden" im Dezimalformat sein (1 Dezimalstelle, d. H. "26 .7" Stunden).

ich durch Gründung Variablen gestartet:

$query_start_date = "2017-08-29 00:00:00"; 
$query_end_date = "2017-08-30 23:59:59"; 

Lassen Sie uns diese die Zeitaufzeichnungen sind davon ausgehen, dass in diesem Zeitrahmen bestehen:

time record 1: 'created'="2017-08-29 08:00:00", 'direction'=1; 
time record 2: 'created'="2017-08-29 16:30:00", 'direction'=0; 
time record 3: 'created'="2017-08-30 08:00:00", 'direction'=1; 
time record 4: 'created'="2017-08-30 16:00:00", 'direction'=0; 

Aber ich weiß nicht, wie die Berechnung zu beginnen. Wählt ich zuerst die Datensätze aus und weise jeden Datensatz einer Variablen als Array zu ...? Jede Hilfe wird geschätzt!

+0

ich nicht die 'Richtung erhalte '-Param. Wenn Sie eine Start- und eine Endzeit haben, warum haben Sie nicht nur zwei Spalten? –

+0

Sind die Datensätze immer in der Reihenfolge der Richtung 1, 0, 1, 0, 1, 0 ... Gibt es Löcher? (zB: zwei aufeinanderfolgende Nullen? – BeetleJuice

+0

Ja, Datensätze werden immer abwechselnd angezeigt, entweder 0, 1, 0, 1 oder 1, 0, 1, 0, je nachdem, wo die Linie mit dem Start-/Enddatum gezeichnet wurde –

Antwort

0

Make Start- und Endzeit in zwei Spalten:

SELECT 
    created as start, 
    (select created from test t2 where t2.created > t.created 
     and direction = 1 order by created limit 1) as end 
    FROM `test` t where direction = 0 

conunt Zeitdifferenz:

select TIME_TO_SEC(TIMEDIFF(end, start))/60/60 as diff, start, end from 
    (SELECT 
    created as start, 
    (select created from test t2 where 
     t2.created > t.created 
     and direction = 1 order by created limit 1) as end 
    FROM `test` t where direction = 0) intervals 

und schließlich Summe zählen:

select sum(TIME_TO_SEC(TIMEDIFF(end, start))/60/60) as total from 
    (SELECT 
    created as start, 
    (select created from test t2 where 
     t2.created > t.created 
     and direction = 1 order by created limit 1) as end 
    FROM `test` t where direction = 0) intervals