如何在oracle PL SQL中找到连续两天迟到的员工
我的主表包含“时钟”视图中的时钟。 这个表非常大,所以我只选择一个id为004634的特定员工并显示其记录如何在oracle PL SQL中找到连续两天迟到的员工,oracle,date-arithmetic,Oracle,Date Arithmetic,我的主表包含“时钟”视图中的时钟。 这个表非常大,所以我只选择一个id为004634的特定员工并显示其记录 my table data is 1 004634 9/1/2017 9/1/2017 9:17:00 AM 2 004634 9/2/2017 9/2/2017 9:17:00 AM 3 004634 9/3/2017 4 004634 9/4/2017 9/4/2017 9:17:00 AM 5 004634 9
my table data is
1 004634 9/1/2017 9/1/2017 9:17:00 AM
2 004634 9/2/2017 9/2/2017 9:17:00 AM
3 004634 9/3/2017
4 004634 9/4/2017 9/4/2017 9:17:00 AM
5 004634 9/5/2017 9/5/2017 9:13:00 AM
6 004634 9/6/2017 9/6/2017 9:17:00 AM
7 004634 9/7/2017 9/7/2017 9:17:00 AM
8 004634 9/8/2017 9/8/2017 9:24:00 AM
9 004634 9/9/2017 9/9/2017 9:00:00 AM
10 004634 9/10/2017
11 004634 9/11/2017 9/11/2017 9:04:00 AM
12 004634 9/12/2017 9/12/2017 9:12:00 AM
13 004634 9/13/2017 9/13/2017 10:45:00 AM
14 004634 9/14/2017 9/14/2017 11:12:00 AM
15 004634 9/15/2017 9/15/2017 9:12:00 AM
我创建了这个查询,它会在上午9:15之后查找所有迟到记录。15分钟是宽限期。15分钟后他考虑迟到。
我的问题是
SELECT AR.EMPLOYEEID,
UPPER(AR.ATTENDANCETYPE) Att,
AR.CLOCKIN,
TO_CHAR(AR.ATTENDANCEDATE, 'dd-MON-yy') Day
FROM TAD_REGISTER_VIEW AR,
EMPMASTERINFO VEI,
SEC_EMPLOYEES S,
TAD_CALENDARDETAIL D
WHERE S.USERID = 'AFZAL'
AND S.MISFLAG = 1
AND AR.ATTENDANCEDATE BETWEEN '01-Sep-17' AND '30-Sep-17'
AND AR.EMPLOYEEID = VEI.EMPLOYEEID
AND AR.APPLICATIONID IS NULL
AND AR.CALENDARID = D.CALENDARID
AND S.EMPLOYEEID = VEI.EMPLOYEEID
AND AR.ATTENDANCETYPE = 'P'
AND AR.EMPLOYEEID= 004634
AND TRIM(TO_CHAR(AR.ATTENDANCEDATE, 'Day')) = TRIM(D.DAY)
AND TO_DATE(TO_CHAR(AR.CLOCKIN, 'fmHH:MI:SS AM'),
'fmHH:MI:SS AM') >=
TO_DATE(TO_CHAR(D.CLOCK_IN + 16 / 1440, 'fmHH:MI:SS AM'),
'fmHH:MI:SS AM')
ORDER BY AR.PATH, AR.EMPLOYEEID, AR.ATTENDANCEDATE;
我对已故员工的查询结果是
1 004634 P 9/1/2017 9:17:00 AM 01-SEP-17
2 004634 P 9/2/2017 9:17:00 AM 02-SEP-17
3 004634 P 9/4/2017 9:17:00 AM 04-SEP-17
4 004634 P 9/6/2017 9:17:00 AM 06-SEP-17
5 004634 P 9/7/2017 9:17:00 AM 07-SEP-17
6 004634 P 9/8/2017 9:24:00 AM 08-SEP-17
7 004634 P 9/13/2017 10:45:00 AM 13-SEP-17
8 004634 P 9/14/2017 11:12:00 AM 14-SEP-17
我想要一个连续两天的结果
比如
2 004634 P 9/2/2017 9:17:00 AM 02-SEP-17
5 004634 P 9/7/2017 9:17:00 AM 07-SEP-17
7 004634 P 9/13/2017 10:45:00 AM 13-SEP-17
使用
LAG
功能获取前一天,并将其与DATE-1
进行比较。但是请注意,您显示的输出没有说明任何关于连续3天(6,7,8)的内容,其中有2个连续的天组。甚至这个查询也会返回
WITH late_employees as
(
SELECT AR.EMPLOYEEID,
UPPER(AR.ATTENDANCETYPE) Att,
AR.CLOCKIN CLOCKIN,
AR.ATTENDANCEDATE ATTENDANCEDATE
FROM TAD_REGISTER_VIEW AR,
EMPMASTERINFO VEI,
SEC_EMPLOYEES S,
TAD_CALENDARDETAIL D
WHERE S.USERID = 'AFZAL'
AND S.MISFLAG = 1
AND AR.ATTENDANCEDATE BETWEEN '01-Sep-17' AND '30-Sep-17'
AND AR.EMPLOYEEID = VEI.EMPLOYEEID
AND AR.APPLICATIONID IS NULL
AND AR.CALENDARID = D.CALENDARID
AND S.EMPLOYEEID = VEI.EMPLOYEEID
AND AR.ATTENDANCETYPE = 'P'
AND AR.EMPLOYEEID= 004634
AND TRIM(TO_CHAR(AR.ATTENDANCEDATE, 'Day')) = TRIM(D.DAY)
AND TO_DATE(TO_CHAR(AR.CLOCKIN, 'fmHH:MI:SS AM'),
'fmHH:MI:SS AM') >=
TO_DATE(TO_CHAR(D.CLOCK_IN + 16 / 1440, 'fmHH:MI:SS AM'),
'fmHH:MI:SS AM')
)
SELECT EMPLOYEE_ID,
att,
clockin,
DAY
FROM
(SELECT l.EMPLOYEE_ID ,
l.att,
l.clockin,
TO_CHAR(l.ATTENDANCEDATE, 'dd-MON-yy') DAY,
CASE
WHEN TRUNC(LAG(l.ATTENDANCEDATE,1) OVER (ORDER BY l.ATTENDANCEDATE)) = TRUNC(l.ATTENDANCEDATE) - 1
THEN 1
END consec_late
FROM late_employees l
)
WHERE consec_late = 1;
输出:
4634 P 9/2/2017 9:17:00 AM 02-09-17
4634 P 9/7/2017 9:17:00 AM 07-09-17
4634 P 9/8/2017 9:24:00 AM 08-09-17
4634 P 9/14/2017 11:12:00 AM 14-09-17
使用超前-滞后功能将很快更新您的信息。谢谢你的帮助