2

我正在开发一个有日班和夜班的考勤系统。我无法过滤员工的进出拳?

对于换班时间:

  • 2013 年 6 月 29 日,进场 22:00,离场 07:00
  • 2013 年 6 月 30 日,15:00 进场,22:30 离场

这是我目前的逻辑:

我正在根据轮班时间和滑动时间以及日期来过滤 IN 和 OUT 打卡,但是当员工从夜班换到白班时,我遇到了问题。

下面是一个场景

员工 101 号在 2013 年 6 月 29 日晚上 22:00 上夜班,他第二天离开意味着 2013 年 6 月 30 日上午 7:00。同样,在同一天(2013 年 6 月 30 日),他于 2013 年 6 月 30 日 15:00 上任,并于同一天 22:30 离开。

如果打卡每天都会来,那么没有问题,但是由于任何问题都没有收到 30-Jun-2013 07:00 AM 打卡然后打卡在 2013 年 6 月 30 日 15:00 OUT 22:30 已经在数据库现在 2013 年 6 月 29 日的出拳时间是 2013 年 6 月 30 日上午 07:00 很难找到这是前一天出拳

注意:有时员工忘记刷入/出拳

我该怎么做?

更新:

我们不知道它是进还是出,除非我需要与轮班时间进行比较,否则只有我可以决定它但是当员工从夜班换到白班然后是夜班的最后一天和白班的第一天进出错了,因为 29-Jun-13 夜班他将在 22:00 来,他在 30-jun-13 07:00 离开,他又在 30-6 月上班- 13 点 15:00,OUT 是 22:30 现在 30-Jun-13 我有三拳,这里的拳可能会以不同的方式进入 db,首先是 13 年 6 月 30 日的 IN 时间或 29-6 月的 OUT 时间13 会来或 30-jun-13 的 OUT 时间会来,所以我遇到了问题

4

2 回答 2

0

您需要更多信息,而不仅仅是打孔时间。我建议您保持员工的当前状态(“IN”、“OUT”或“ERROR”)。然后,当收到一拳时,请执行以下操作:

1.  If the employee status is ERROR:
    A. Record the punch as an ERROR which must be addressed by a supervisor.

2.  If the employee is IN:
    A. If the time since the last punch is greater than the max number of hours
       an employee is allowed to work consecutively
       i.  Flag the punch as an ERROR which must be addressed by a supervisor.
       ii. Change the status of the employee to ERROR.
    B. Otherwise:
       i. Treat this as an OUT punch.
       ii.  Change the status of the employee to OUT.

3.  If the employee is OUT:
    A. Treat this as an IN punch.
    B. Change the status of the employee to IN.

您需要提供主管时钟维护应用程序,以允许主管更新员工和打卡的状态,并根据需要删除或添加打卡。

于 2013-07-04T20:34:37.257 回答
0

将您的打卡日期表视为:

emp_punch_time (empno, punch_time)

该表只存储empno(即员工编号)和punch_time(包括日期和时间)。

在这种情况下,您可以执行以下操作:

WITH emp_punch_time AS (
-- This common table expression is just for your illustration.
-- When using this query on your base tables remove this CTE and make
-- appropriate changes to the subsequent queries.
SELECT 7369 AS empno
       , TO_DATE('29-JUN-2013 22:00:00', 'DD-MON-YYYY HH24:MI:SS') punch_time
  FROM dual
UNION
SELECT 7369, TO_DATE('30-JUN-2013 07:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7369, TO_DATE('30-JUN-2013 15:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7369, TO_DATE('30-JUN-2013 22:30:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7370, TO_DATE('29-JUN-2013 07:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7370, TO_DATE('29-JUN-2013 15:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7370, TO_DATE('29-JUN-2013 22:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
UNION
SELECT 7370, TO_DATE('30-JUN-2013 07:00:00', 'DD-MON-YYYY HH24:MI:SS') FROM dual
)
, punch AS (
SELECT p.empno
       , p.punch_time
       , CASE MOD(row_number() over (partition by empno
                                         order by p.punch_time asc), 2)
            WHEN 1 THEN 'IN'
            ELSE 'OUT'
         END AS punch_type
  FROM emp_punch_time p)
, punch_repo AS (
SELECT p.empno
       , p.punch_time AS in_time
       , (SELECT punch_time
            FROM punch p_out
           WHERE p_out.punch_type = 'OUT'
             AND p_out.empno = p.empno
             AND p_out.punch_time = (SELECT MIN(punch_time)
                                       FROM punch p_min
                                      WHERE p_min.punch_type = 'OUT'
                                        AND p_min.empno = p_out.empno
                                        AND p_min.punch_time > p.punch_time))
         AS out_time
  FROM punch p
 WHERE punch_type = 'IN'
)
SELECT empno
       , TO_CHAR(in_time, 'DD-MON-YYYY HH24:MI:SS') in_time
       , TO_CHAR(out_time, 'DD-MON-YYYY HH24:MI:SS') out_time
       , TRIM(TO_CHAR(FLOOR((out_time - in_time) * 24), '09'))
         ||':'
         || TRIM(TO_CHAR(FLOOR(MOD((out_time - in_time)*24, 1) * 60), '09'))
         AS time_spent
  FROM punch_repo
;

输出

  EMPNO   IN_TIME                 OUT_TIME                TIME_SPENT
  7369    29-JUN-2013 22:00:00    30-JUN-2013 07:00:00    09:00
  7369    30-JUN-2013 15:00:00    30-JUN-2013 22:30:00    07:30
  7370    29-JUN-2013 07:00:00    29-JUN-2013 15:00:00    08:00
  7370    29-JUN-2013 22:00:00    30-JUN-2013 07:00:00    09:00
于 2013-07-05T10:24:30.457 回答