2016-11-19 3 views
0

J'ai une table avec les données suivantes:MySQL - nombre de jours travaillés dans la plage de dates

empid | officeid |  doj 
-------+----------+------------ 
    19 | 112 | 2012-05-06 
    26 | 112 | 2012-10-16 
    35 | 112 | 2014-05-01 
    17 | 112 | 2015-12-14 
    19 | 169 | 2016-10-07 
    26 | 146 | 2015-08-07 
    42 | 102 | 2016-06-07 
    35 | 135 | 2016-10-15 
    26 | 112 | 2016-10-20 

(DOJ = date d'adhésion). Je dois obtenir un rapport des employés avec le nombre de jours travaillés dans un bureau, pour une période donnée. Par exemple, je veux un rapport de ID de bureau 112 pour Octobre 2016. Donc, le résultat devrait être comme ceci:

empid | days 
-------+------- 
    35 | 14 (moved to another office on October 15th) 
    17 | 31 (complete month) 
    26 | 11 (October 20 to 31) 
    42 | 31 (complete month) 

L'employé 19 ne devrait pas venir puisqu'il n'est pas au bureau 112 maintenant. Ce que j'ai essayé:

select sh.empid,datediff(
    greatest(last_day('2016-10-01'), 
    (select doj from servicehistory where empid=sh.empid and date<sh.date 
     order by date desc limit 1) 
    ),date 
) as days from servicehistory sh where sh.office='112' and date=(
    if(
     ((select count(date) from servicehistory where empid=sh.empid and 
      date between '2016-10-01' and '2016-10-31')>0), 
     (select date from servicehistory where empid=sh.empid and 
      date between '2016-10-01' and '2016-10-31' limit 1), 
     (select max(date) from servicehistory where empid=sh.empid and 
      office=sh.office and date<=last_day('2016-10-01')) 
    ) 
) 

Mais cela ne donne pas les résultats souhaités. Il donne des jours de plus de 31 et des employés qui ne sont pas actuellement au bureau.

Répondre

1
select (case when tmp.doj<='2016-10-01' then DATEDIFF(last_day('2016-10-01'),'2016-10-01') 
else DATEDIFF(last_day('2016-10-01'),tmp.doj) end)as days,tmp.emp_id from (
select emp_id,max(doj)as doj from emp e group by emp_id)tmp 

Essayez ceci et modifiez selon vos besoins.

+0

Merci. Ça a marché. –