-1

员工A

E_no  E_name   E_Ag_ref  E_Type  Status          E_Entry_Date
----------------------------------------------------------------    
1B    Mike     12345       B     Continued   08/01/2013 12:24:20
1S   steve     12345       S     Continued   08/01/2013 12:25:20
2B   Radek     1001        B     Continued   08/01/2013 16:24:20
2S   Rafal     1001        S     nContinued  06/01/2014 20:24:20

询问:

select * 
from 
    Employee E1,
    Employee E2 
where 
    ((substr(E1.E_no,1,length(E1.E_no)-1) || 'S')=E2.E_no and E2.E_Type='S' )
    and ( ( TO_CHAR(E1.E_Entry_Date,'YYYYMMDD HH24:MI:SS') )  between ((:startDate)||' '|| (:startTime)) and  ((:endDate)||' '||(:endTime)) OR ('ALL'  between (:startTime) and (:endTime))  )
    and ( ( TO_CHAR(E2.E_Entry_Date,'YYYYMMDD HH24:MI:SS') )  between ((:startDate)||' '|| (:startTime)) and  ((:endDate)||' '||(:endTime)) OR ('ALL'  between (:startTime) and (:endTime))  )
    and E2.E_Type='B' and E1.status='Continued' and E2.status='Continued'

上面的查询返回以下 3 条记录。

1B    Mike     12345       B     Continued   08/01/2013 12:24:20
1S   steve     12345       S     Continued   08/01/2013 12:25:20
2B   Radek     1001        B     Continued   08/01/2013 16:24:20

输入参数:

startDate:06/01/2012
endDate:  08/01/2013

startTime: 13:00:00
endTIme:   21:00:00

预期结果:

1B    Mike     12345       B     Continued   08/01/2013 12:24:20

请任何人建议,如何解决这个问题。

问候, Komaturi

4

1 回答 1

0

我认为您正在尝试这样做:

SQL> select e1.*
  2    from employee e1
  3         inner join employee e2
  4                 on substr(e1.e_no, 1, length(e1.e_no)-1) || 'S' = e2.e_no
  5   where e1.E_Type = 'B'
  6     and e2.E_Type = 'S'
  7     and e1.status='Continued'
  8     and e2.status='Continued'
  9     and (  '' = 'ALL' -- set the left side to ALL if you don't want to compare dates.
 10          or (e1.E_Entry_Date between to_date('06/01/2012 13:00:00', 'dd/mm/yyyy hh24:mi:ss')
 11                                  and to_date('08/01/2013 21:00:00', 'dd/mm/yyyy hh24:mi:ss')
 12              and e2.E_Entry_Date between to_date('06/01/2012 13:00:00', 'dd/mm/yyyy hh24:mi:ss')
 13                                      and to_date('08/01/2013 21:00:00', 'dd/mm/yyyy hh24:mi:ss'))
 14         );

E_ E_NAME       E_AG_REF E STATUS     E_ENTRY_DATE
-- ---------- ---------- - ---------- -------------------
1B Mike            12345 B Continued  08/01/2013 12:24:20

您的原始 SQL 不能是您实际运行的。即使我们掩盖了日期到字符转换的东西,你也有

    E2.E_Type='S'
AND E2.E_Type='B' 

这不可能是真的(这些根本不是 OR'd)。你可能是E1.e_type = 'B'说我猜。

于 2013-01-08T17:50:53.797 回答