0

not like运算符不适合比较单个工作日期的值数大于 1 的值。在下面的示例中,前 2 行中的记录是匹配项(粗体 = 粗体,斜体 = 斜体),不应出现在输出中。该问题是由“不喜欢”运算符循环引起的。

我已将代码简化如下:

  SELECT e.EMP_NAME AS APS,
         TO_CHAR (ws.WRKS_WORK_DATE, 'dd.mm.yyyy') AS Work_Date,
         TO_CHAR ( (wd.WRKD_START_TIME), 'hh24:mi') AS Leave_Start_Time,
         TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi') AS Leave_End_Time,
         TO_CHAR (sb.SHFTBRK_DEF_START, 'hh24:mi') AS shift_brk_Start,
         TO_CHAR (sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES + 1) * .000694,
                  'hh24:mi')
            AS shift_brk_end
    FROM work.WORK_SUMMARY ws,
         work.employee e,
         work.work_detail wd,
         work.TIME_CODE tc,
         work.shift s,
         work.shift_break sb,
         work.EMPLOYEE_SCHEDULE es
   WHERE     ws.emp_id = e.emp_id
         AND wd.WRKD_MINUTES < s.SHFT_VAL1 ---sum workd minutes less than shift id actual shift minutes
         AND ws.WRKS_WORK_DATE BETWEEN '09-Jul-2013' AND '09-Jul-2013'
         AND wd.WRKS_ID = ws.WRKS_ID
         AND tc.TCODE_name IN
                ('COMP', 'SL COMP PEN', 'ARB','LUC',
                 'CMF', 'MREP', 'WSSL', 'RL',
                 'CBK', 'JUR', 'LSL', 'LSLT',
                 'LWPNC', 'LWPS', 'LWPTC', 'LWPU',
                 'LWOP', 'ML', 'MLHP', 'NWPTC',
                 'PAT', 'PL', 'SD', 'MSP',
                 'SUS', 'SUSW', 'WIT', 'CMPA',
                 'ABC', 'ABN', 'BER', 'COM',
                 'COMWP', 'IS', 'EXL', 'LFI',
                 'MER', 'NCD', 'PCLC', 'PCLS',
                 'PSLC', 'PSLN', 'PSLW', 'PSWO',
                 'PSLP', 'PURL', 'STU', 'UA',
                 'GRTW')
         AND wd.TCODE_ID = tc.TCODE_ID
         AND ws.PAYGRP_ID IN ('10023')
         AND ws.WRKS_AUTHORIZED = 'Y'
         AND e.EMP_TERMINATION_DATE >= CURRENT_DATE
         --and e.emp_name in('1100376801','1100590701')
         AND ws.WRKS_WORK_DATE = es.WORK_DATE
         AND ws.emp_id = es.emp_id
         AND ws.shft_id = es.EMPSKD_ACT_SHIFT_ID
         AND es.EMPSKD_ACT_SHIFT_ID = s.SHFT_ID
         AND s.SHFT_ID = sb.SHFT_ID
         AND (   (    TO_CHAR (sb.SHFTBRK_DEF_START, 'hh24:mi') <=
                         TO_CHAR ( (wd.WRKD_START_TIME), 'hh24:mi')
                  AND TO_CHAR (
                           sb.SHFTBRK_DEF_START
                         + (sb.SHFTBRK_MINUTES + 1) * .000694,
                         'hh24:mi') >
                         TO_CHAR ( (wd.WRKD_START_TIME), 'hh24:mi'))
              OR (    TO_CHAR (sb.SHFTBRK_DEF_START, 'hh24:mi') <
                         TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi')
                  AND TO_CHAR (
                           sb.SHFTBRK_DEF_START
                         + (sb.SHFTBRK_MINUTES + 1) * .000694,
                         'hh24:mi') > TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi'))
              OR (    TO_CHAR (sb.SHFTBRK_DEF_START, 'hh24:mi') >
                         TO_CHAR ( (wd.WRKD_START_TIME), 'hh24:mi')
                  AND TO_CHAR (
                           sb.SHFTBRK_DEF_START
                         + (sb.SHFTBRK_MINUTES + 1) * .000694,
                         'hh24:mi') < TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi'))
              OR (    TO_CHAR (sb.SHFTBRK_DEF_START, 'hh24:mi') =
                         TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi')
                  AND TO_CHAR (
                           sb.SHFTBRK_DEF_START
                         + (sb.SHFTBRK_MINUTES + 1) * .000694,
                         'hh24:mi') = TO_CHAR ( (wd.WRKD_end_TIME), 'hh24:mi')))
GROUP BY e.EMP_NAME,
         ws.WRKS_WORK_DATE,
         wd.WRKD_end_TIME,
         wd.WRKD_START_TIME,
         sb.SHFTBRK_DEF_START,
         TO_CHAR (sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES + 1) * .000694,
                  'hh24:mi');

结果:

APS         WORK_DATE   LEAVE_START_TIME LEAVE_END_TIME SHIFT_BRK_START SHIFT_BRK_END
-------------------------------------------------------------------------------------
40151401  09.07.2013  10:00            13:00          10:30           11:00
40200001  09.07.2013  09:00            12:51          10:00           10:30
40447701  09.07.2013  09:30            14:15          10:00           10:30
40492101  09.07.2013  15:00            20:10          16:00           16:30
61037301  09.07.2013  10:35            14:15          11:00           11:30
64173401  09.07.2013  09:30            14:15          10:00           10:30

问题是我希望看到员工 1100376801
的记录。我看不到记录的原因是因为丢失记录的时间超过了午夜,即00:51。 如何以不同的方式格式化“日期时间”字段,以便获取午夜的时间,即 SHIFT_BRK_START 和 SHIFT_BRK_END 时间跨度或落在 LEAVE_START_TIME 和 LEAVE_END_TIME 内。

预期结果:除了上面返回的结果,我还应该看到以下记录:

APS         WORK_DATE   LEAVE_START_TIME LEAVE_END_TIME SHIFT_BRK_START SHIFT_BRK_END
-------------------------------------------------------------------------------------
11003701  09.07.2013  20:00            **0:51**       19:30           19:45

解析度:

and 
(

(to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') < (wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') > (wd.WRKD_start_TIME))---1


OR(to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') =(wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') = (wd.WRKD_end_TIME))--4

OR(to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') =(wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') > (wd.WRKD_end_TIME))---5

OR(to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') =(wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') <(wd.WRKD_end_TIME))---5

OR (to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') > (wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') <= (wd.WRKD_end_TIME))---3

OR (to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') > (wd.WRKD_START_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') < (wd.WRKD_end_TIME) and 
to_date(to_char(wd.WRKD_START_TIME, 'dd.mm.yyyy') || '' || to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'hh24:mi'), 'dd.mm.yyyy hh24:mi') > (wd.WRKD_end_TIME))---2

)
4

1 回答 1

0

它仍然不清楚您的要求和数据

以下是需要检查的几点:

  • 检查以下两个查询'ALTER SESSION NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';
(e.EMP_NAME || '_' || TO_CHAR(ws.WRKS_WORK_DATE,'dd.mm.yyyy') || '_' ||to_char(min(wd.WRKD_START_TIME), 'HH24:MI')|| '_' ||to_char(max(wd.WRKD_end_TIME), 'HH24:MI')) as test
(e.EMP_NAME || '_' || TO_CHAR(ws.WRKS_WORK_DATE,'dd.mm.yyyy') || '_' ||to_char(sb.SHFTBRK_DEF_START,'HH24:MI')|| '_' ||to_char(sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES+1)*.000694, 'HH24:MI')) as test
  • 最外层查询的条件可能无法按预期工作, not like运算符将失败,因为您对该列的内部查询test不同。

where a_emp_break.test not like b_shift_break.test
                         and a_emp_break.APS=b_shift_break.APS
                         and a_emp_break.Work_Date = b_shift_break.Work_Date
  • 你没有在任何地方提到你需要的日期。

更新

  • 再次检查以下外部查询: TO_CHAR (sb.SHFTBRK_DEF_START + (sb.SHFTBRK_MINUTES + 1) * .000694, 'hh24:mi') AS shift_brk_end
  • AND ws.WRKS_WORK_DATE BETWEEN '09-Jul-2013' AND '09-Jul-2013'检查以上是否包含所需的 ID。
  • <再次检查使用和>符号精确的 to_date() 函数的条件。

谢谢。

于 2013-08-07T03:17:22.117 回答