我正在工作员工时间表,下面是表格。部门员工有两个班次Tech Support
,Network
即[ 8:00 AM to 2:00 PM ]
和[ 1:00 PM to 7:00 PM ]
和正常班次[ 9:00 AM to 6:00 PM ]
现在,我想得到关于迟到早退的人的报告。我对服务器端代码的逻辑很少,但它的运行速度非常慢。所以我想从数据库中制作它。
我在做什么
我正在生成报告,迟到早退的员工
算法
- 查找员工开始时间..与部门..和各自的班次
- 如果员工部门是软件,则进行一次轮班,否则每天进行两次轮班
- 从打卡时间和注销时间..找到员工班次。
- 如果员工轮班在第一班,请使用 intime as
08:00:00 AM
和 outtime as01:00:00 PM
- 如果员工轮班在第二班,则使用 intime as
02:00:00 PM
和 outtime as07:00:00 PM
- 如果员工班次在正常班次下,请使用 intime as
08:55:00 AM
和 outtime as06:00:00 PM
然后找到,现在找到它的login_time并登录
表
雇员
emp_id | emp_name | emp_dept
--------------------------------------
1 | Billy J | 1
2 | Sarah k | 2
3 | Takashi M | 3
4 | Matsuzaka | 2
部
dept_id | dept_name
--------------------------
1 | Software
2 | Tech Support
3 | Network
员工登录
emp_id | login_time | logout_time
----------------------------------------------------------
1 | 2013-02-18 19:10:42 | 2013-02-18 21:27:37
2 | 2013-02-18 19:38:59 | 2013-02-18 22:46:14
3 | 2013-02-18 15:13:53 | 2013-01-01 18:26:39
4 | 2013-01-01 08:41:40 | 2013-01-01 016:41:40
SQL查询,我试过了,有点不完整..
SELECT e.emp_id, e.emp_name, d.dept_name,
CASE d.dept_name
WHEN d.dept_name IN ('Software') THEN
@intime := '08:55:00 AM'
ELSE
@intime := '02:00:00 PM'
END AS `StartingTime`,
@entrytime := DATE_FORMAT(el.login_time, '%r%') AS `Entered into Office`
TIMEDIFF(@entryTime,@intime) `difference`,
IF(TIMEDIFF(@entryTime,@intime)<'00:00:00',NULL,TIMEDIFF(@entryTime,@intime)) AS `Delay`
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 '2013-06-01' AND '2013-06-26'
ORDER BY el.login_time DESC;