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
Un employé entre seulement deux fois un jour donné? – Strawberry
Il peut avoir des entrées avec plusieurs entrées et sorties, chaque entrée et sortie ont des enregistrements enregistrés –
Ensuite, l'exemple ne reflète pas vraiment la réalité. – Strawberry