2017-10-10 1 views
-1

Ich habe die Anforderung, die produktiven Stunden eines Mitarbeiters mit MySQL zu berechnen. Wo eine Bio-Metrik die IN-Zeit und -Auszeit des jeweiligen Mitarbeiters erfasst.MySQL: Employee Produktive Stundenberechnung

Die Daten in emp_device_attendance Tabelle sehen genauso aus wie unten:

**log_date   device_id emp_code device_direction** 
2017-09-25 19:34:14 108   400148   out 
2017-09-25 14:07:13 106   400148   in 
2017-09-25 13:25:10 108   400148   out 
2017-09-25 10:45:03 106   400148   in 

Aus der obigen Tabelle I durch Ausschließen der Zeit einen Bericht darstellen müssen, dass er „out“ ausgegeben. Wir müssen zeigen, wie viel Zeit er dort im Büro hat.

Die Ausgabe sollte wie folgt aussehen werden:

emp_id date   in_time out_time total_hrs productive_hrs 
400148 2017-09-25 10:45:03 19:34:14 08:49:11 08:07:41 

kann mir bitte jemand helfen, dies in MySQL zu tun.

+1

Ein Mitarbeiter gibt nur zweimal an einem bestimmten Tag ein? – Strawberry

+0

Er kann Einträge mit mehreren Ein- und Ausgängen haben, jeder Ein- und Ausgang hat Datensätze gespeichert –

+0

Dann das Beispiel nicht wirklich die Realität angemessen wider. – Strawberry

Antwort

0

Lassen Sie mich Abfrage erklären.

Subquery in_timing:

Diese Unterabfrage wird verwendet, um alle in der Zeit des Benutzers zu berechnen und auf bestimmtes Datum. Es wird eine Zeilennummer generiert, deren Werte zurückgesetzt werden, wenn sich der emp_code oder das Datum (log_date) ändert.

Subquery out_timing:

Diese Unterabfrage wird verwendet, um alle Zeit des Benutzers und auf bestimmtes Datum berechnen aus. Es wird eine Zeilennummer generiert, deren Werte zurückgesetzt werden, wenn sich der emp_code oder das Datum (log_date) ändert.

Beitreten zum Ergebnis: Fügen Sie nun diese beiden Unterabfragen basierend auf emp_code, date (log_date) und row_number hinzu.

Jetzt mit timediff und sec_to_time und time_to_sec können Sie Ihr gewünschtes Ergebnis erhalten.

Ich hoffe, das wird Ihnen helfen.

create table emp_device_attendance (
    log_date timestamp, 
    device_id int, 
    emp_code varchar(20), 
    device_direction varchar(5) 
); 

insert into emp_device_attendance values('2017-09-25 19:34:14',108,'400148','out'); 
insert into emp_device_attendance values('2017-09-25 14:07:13',106,'400148','in'); 
insert into emp_device_attendance values('2017-09-25 13:25:10',108,'400148','out'); 
insert into emp_device_attendance values('2017-09-25 10:45:03',106,'400148','in'); 

set @inNumber = 0; 
set @inEmpCode = ''; 
set @inLogDate = ''; 
set @outNumber = 0; 
set @outEmpCode = ''; 
set @outLogDate = ''; 

select abc.emp_code,abc.date1,min(in_time) ,max(out_time), 
timediff(max(out_time), min(in_time)) total_hrs, 
sec_to_time(sum(productive_hrs)) productive_hrs 
from ( 
select in_timing.emp_code,in_timing.date1, 
min(in_timing.log_date) as in_time, 
max(out_timing.log_date) as out_time, 
time_to_sec(timediff(max(out_timing.log_date), min(in_timing.log_date))) productive_hrs 
from 
(select device_id,emp_code,device_direction, date(log_date) as date1, log_date , 
    if(@inEmpCode = emp_code and @inLogDate = date(log_date) , @inNumber := @inNumber + 1 ,@inNumber := 1) row_number, 
    @inEmpCode := emp_code ,@inLogDate := date(log_date) 

    from emp_device_attendance 
    where 
    device_direction = 'in' 
    order by log_date, emp_code 
) in_timing join 
(select device_id,emp_code,device_direction, date(log_date) as date1, log_date , 
    if(@outEmpCode = emp_code and @outLogDate = date(log_date) , @outNumber := @outNumber + 1 ,@outNumber := 1) row_number, 
    @outEmpCode := emp_code ,@outLogDate := date(log_date) 

    from emp_device_attendance 
    where 
    device_direction = 'out' 
    order by log_date, emp_code) out_timing on in_timing.row_number = out_timing.row_number 
and in_timing.emp_code = out_timing.emp_code 
and in_timing.date1 = out_timing.date1 

group by in_timing.emp_code,in_timing.date1 
,in_timing.row_number) abc 
group by abc.emp_code,abc.date1 
+0

Guten Kummer, das ist eine Menge Frage :-( – Strawberry

+0

@Strawberry Ich dachte schon, aber es behandelt alle Testfälle, weil es so viel Abfrage hat. –

+0

@FahadAnjum Die Abfrage kehrt gleich für Total und Produktive Stunden, die werden Produzierende Stunden werden sich unterscheiden, wenn wir am selben Tag mehrere Ein- und Ausgänge haben –

0

Hier ist eine Idee. Ich würde sagen, dass dies bestimmte Annahmen über Ihren Datensatz trifft, die wahr sein können oder auch nicht, aber es sollte Ihnen die Idee geben ...

+0

Haben Sie es für mehr als zwei in und aus getestet? –

+0

@FahadAnjum Ich muss nicht ;-) - aber es wird angenommen, dass es einen (gleichen Tag) 'out' für jedes 'in' gibt – Strawberry

Verwandte Themen