2017-10-10 12 views
-1

Je dois calculer les heures productives d'un employé utilisant MySQL. Où un Bio-métrique capturera le temps d'entrée et de sortie de l'employé respectif.MySQL: Calcul des heures productives des employés

Les données dans emp_device_attendance tableau ressemble exactement comme ci-dessous:

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

Dans le tableau ci-dessus, je dois représenter un rapport en excluant le temps qu'il a passé « out ». Moyens que nous devons présenter combien de temps il est là au bureau.

La sortie devrait être ressembler à ceci:

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 

quelqu'un peut me aider s'il vous plaît le faire dans MySQL.

+1

Un employé entre seulement deux fois un jour donné? – Strawberry

+0

Il peut avoir des entrées avec plusieurs entrées et sorties, chaque entrée et sortie ont des enregistrements enregistrés –

+0

Ensuite, l'exemple ne reflète pas vraiment la réalité. – Strawberry

Répondre

0

Laissez-moi vous expliquer la requête.

in_timing sous-requête:

Cette sous-requête est utilisé pour calculer tous dans le temps de l'utilisateur et la date particulière. Un row_number est généré dont les valeurs sont réinitialisées s'il y a un changement dans emp_code ou date (log_date).

out_timing sous-requête:

Cette sous-requête est utilisé pour calculer tous à temps de l'utilisateur et la date particulière. Un row_number est généré dont les valeurs sont réinitialisées s'il y a un changement dans emp_code ou date (log_date).

Rejoindre le résultat: Joignez maintenant ces deux sous-requêtes en fonction de emp_code, date (log_date) et row_number. Maintenant, utilisez timediff et sec_to_time et time_to_sec vous pouvez obtenir le résultat requis.

J'espère que cela va vous aider.

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

Bon chagrin, c'est beaucoup de requête :-( – Strawberry

+0

@Strawberry je le pensais, mais il gère tous les cas de test à cause de cela il a beaucoup de requête –

+0

@FahadAnjum La requête retourne même pour Total et Productive Hours, qui sera –

0

Voici une idée. Je dois dire que cela fait certaines hypothèses au sujet de votre ensemble de données, qui peuvent ou peuvent ne pas être vrai, mais il devrait vous donner une idée ...

SELECT emp_code 
    , DATE(log_date) dt 
    , SEC_TO_TIME(SUM(subtotal)) t 
    FROM 
    (SELECT x.emp_code 
      , x.log_date 
      ,TIME_TO_SEC(x.log_date)-TIME_TO_SEC(MAX(y.log_date)) subtotal 
     FROM emp_device_attendance x 
     JOIN emp_device_attendance y 
      ON y.emp_code = x.emp_code 
      AND y.log_date < x.log_date 
      AND y.device_direction = 'in' 
     WHERE x.device_direction = 'out' 
     GROUP 
      BY x.emp_code,x.log_date 
    ) a 
GROUP 
    BY emp_code,dt; 
+0

Avez-vous testé pour plus de deux entrées et sorties? –

+0

@FahadAnjum Je n'ai pas besoin de ;-) - mais il suppose qu'il y a un «out» (même jour) pour chaque «in» – Strawberry