私は従業員のタイムシートに取り組んでおり、以下は表です。部門の従業員には2つのシフトがありTech Support
、Network
つまり[ 8:00 AM to 2:00 PM ]
、[ 1:00 PM to 7:00 PM ]
そして通常シフト[ 9:00 AM to 6:00 PM ]
今、私が遅刻と早退の報告を得ようとしていること。サーバー側のコードに関するロジックはほとんどありませんが、実行速度が非常に遅いです。だから私はデータベースからそれを作りたかった。
私がしていること
遅刻して早退する従業員のレポートを生成しています
アルゴリズム
- 従業員の開始時刻を見つける..それぞれの部署..とそれぞれのシフト
- 従業員部門がソフトウェアの場合は、1 時間シフトを行い、それ以外の場合は、日によって 2 時間シフトを行います。
- パンチイン時間とログアウト時間から..従業員のシフトを見つけます。
- 従業員のシフトが第 1 シフトの場合、intime を as
08:00:00 AM
および outtime を asとして使用します。01:00:00 PM
- 従業員のシフトが第 2 シフトの場合、intime を as
02:00:00 PM
および outtime を asとして使用します。07:00:00 PM
- 従業員のシフトが通常シフトの場合、intime を as
08:55:00 AM
および outtime を asとして使用します。06: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;