Below is the code for this new simplified CASE Fiddle . Here is the old CASE Fiddle .
- Some columns are really not needed, and you can eliminate them if you want.
- Pay attention! that I had to use CASE in every column that needed to be set in accordance with the conditions for the departments. Also, please note that I used the timings you asked when begging your question. If you want to change them, do not forget to do it in each CASE statement, otherwise you will not get the desired results.
SELECT e.emp_id, d.dept_name, e.emp_name, CASE d.dept_name WHEN 'Tech Support' THEN '08:00:00' WHEN 'Network' THEN '13:00:00' ELSE '09:00:00' END AS `StartingTime`, CASE d.dept_name WHEN 'Tech Support' THEN '14:00:00' WHEN 'Network' THEN '19:00:00' ELSE '18:00:00' END AS `EndingTime`, TIME_FORMAT(el.login_time, '%T') AS `Entered_into_Office`, TIME_FORMAT(el.logout_time, '%T') AS `Left_from_Office`, CASE d.dept_name WHEN 'Tech Support' THEN TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('08:00:00', '%T')), '%T') WHEN 'Network' THEN TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('13:00:00', '%T')), '%T') ELSE TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('09:00:00', '%T')), '%T') END AS `Time_in_diff`, CASE d.dept_name WHEN 'Tech Support' THEN TIME_FORMAT(TIMEDIFF(TIME_FORMAT('14:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T') WHEN 'Network' THEN TIME_FORMAT(TIMEDIFF(TIME_FORMAT('19:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T') ELSE TIME_FORMAT(TIMEDIFF(TIME_FORMAT('18:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T') END AS `Time_out_diff`, CASE d.dept_name WHEN 'Tech Support' THEN TIME_FORMAT(SEC_TO_TIME( TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('08:00:00', '%T')), '%T')) +TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT('14:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T'))), '%T') WHEN 'Network' THEN TIME_FORMAT(SEC_TO_TIME( TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('13:00:00', '%T')), '%T')) +TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT('19:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T'))), '%T') ELSE TIME_FORMAT(SEC_TO_TIME( TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT(el.login_time, '%T'), TIME_FORMAT('09:00:00', '%T')), '%T')) +TIME_TO_SEC(TIME_FORMAT(TIMEDIFF(TIME_FORMAT('18:00:00', '%T'), TIME_FORMAT(el.logout_time, '%T')), '%T'))), '%T') END AS `Total_time_diff` FROM employees e INNER JOIN department d ON d.dept_id = e.emp_dept INNER JOIN employee_login el ON el.emp_id = e.emp_id WHERE DATE_FORMAT(el.login_time, '%Y-%m-%d') BETWEEN '2012-01-01' AND '2013-12-31' HAVING Total_time_diff > 0;
Below are my previous solutions:
In this SQLFiddle, I made 4 queries for your area. This is a request for one department. I did not use the CASE condition, but it works. One for each time shift and one data reception for all time sheets. For later, I had to remove this line: ORDER BY Time_in_diff DESC; for UNION success to be successful. Let me know if this helps! Here is a solution with prepared instructions .