-1

EmployeeA

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

誰かがこれを修正する方法を提案できますか?

よろしく、コマツリ

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 を実際に実行することはできません。日付から char への変換について詳しく説明したとしても、

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

これは真ではありません (これらはまったく OR されませんでした)。あなたはおそらくE1.e_type = 'B'私が推測することを意味しました。

于 2013-01-08T17:50:53.797 に答える