Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在oracle PL SQL中找到连续两天迟到的员工_Oracle_Date Arithmetic - Fatal编程技术网

如何在oracle PL SQL中找到连续两天迟到的员工

如何在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

我的主表包含“时钟”视图中的时钟。 这个表非常大,所以我只选择一个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/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

使用超前-滞后功能将很快更新您的信息。谢谢你的帮助