Oracle 如何使用两个不同的日期列获取相同日期之间的数据

Oracle 如何使用两个不同的日期列获取相同日期之间的数据,oracle,oracle11g,Oracle,Oracle11g,我想要ind_emp_leaves表中的用户名,这些用户名是在相同日期之间申请的雇主假期,包括from date和to date ind_emp_leaves table username Leavefromdate leavetodate -------- ------------- --------- nagarajan 20-JUN-13 21-JUN-13 dhinesh 05-SEP-13 08-SEP-13 raju 08

我想要ind_emp_leaves表中的用户名,这些用户名是在相同日期之间申请的雇主假期,包括from date和to date

ind_emp_leaves table

username  Leavefromdate   leavetodate
--------  -------------    ---------
nagarajan   20-JUN-13      21-JUN-13
dhinesh     05-SEP-13      08-SEP-13
raju        08-SEP-13      11-SEP-13

在上表中,dhinesh和raju leave应用于同一日期在两个日期之间,一个日期也包括在内,nagarajan应用了不同的日期,因此我需要dhinesh和raju的用户名。

您可以使用exists子句查找日期重叠的行:

或者,如果您想了解重叠,而不仅仅是它的存在,您可以使用外部连接:

select iel.username, iel.leavefromdate, iel.leavetodate,
  iel2.username as overlaps
from ind_emp_leaves iel
left join ind_emp_leaves iel2
on not (iel2.leavetodate < iel.leavefromdate
  or iel2.leavefromdate > iel.leavetodate)
  and iel2.rowid != iel.rowid
where iel2.username is not null;

USERNAME   LEAVEFROMDATE LEAVETODATE OVERLAPS 
---------- ------------- ----------- ----------
raju       08-SEP-13     11-SEP-13   dhinesh    
dhinesh    05-SEP-13     08-SEP-13   raju       
在这两种情况下,联接都在查找不同的行,因为rowid不匹配,其中日期范围不完全在您要查看的主行之外

诗篇12篇;如果您有两个日期范围,那么有很多方法可以重叠,因此当它们无法重叠时,有时更容易查看。如果一个范围完全超出另一个范围,则它们不会重叠。也就是说,任一范围的“截止”日期早于另一范围的“起始”日期

如果你看问题的前两行,它们不会重叠,因为“2013年6月21日<2013年9月05日”是正确的。如果比较第二行和第三行,“08-Sep-13<08-Sep-13”为假,因此它们确实重叠

因此,iel2.leavetodateiel.leavetodate中的逻辑是确定一个范围完全超出另一个范围的位置,并且两个范围不重叠。因为我们想知道他们什么时候这么做,所以整个表达式被否定为not


从逻辑上讲,这与说明iel2.leavetodate>=iel.leavefromdate和iel2.leavefromdate相同。我想知道哪里不起作用,请解释你的answer@psaraj12-我添加了一个解释,这可能有帮助,也可能没有帮助。我也发现了,一个也显示了同样的想法。感谢Alex的解释和链接,我有一个问题,例如,如果我有两组数据,第1行:-9月4日至9月6日,第2行:-9月3日至9月9日,那么结果将是错误的,我们如何处理它@诗篇12-为什么结果会是错误的?你会认为这是一个重叠,对吗,或者使用您的示例和第二个版本,[这显示了所有重叠]。我看不出有什么问题,所以我不确定你的意思。如果你能想出一个你不理解的场景,最好创建一个可复制的测试用例,并提出一个单独的问题。@psaraj12-我不是这样理解的,只是比较需要包括开始和结束日期,并且需要找到任何重叠。如果不是这样,OP需要澄清。
select iel.username, iel.leavefromdate, iel.leavetodate,
  iel2.username as overlaps
from ind_emp_leaves iel
left join ind_emp_leaves iel2
on not (iel2.leavetodate < iel.leavefromdate
  or iel2.leavefromdate > iel.leavetodate)
  and iel2.rowid != iel.rowid
where iel2.username is not null;

USERNAME   LEAVEFROMDATE LEAVETODATE OVERLAPS 
---------- ------------- ----------- ----------
raju       08-SEP-13     11-SEP-13   dhinesh    
dhinesh    05-SEP-13     08-SEP-13   raju