选择新dateStart和new DateEnd而不是Intersection的所有行。神谕

时间:2017-04-19 09:27:10

标签: sql oracle date

我有桌子SOME_TABLE

id   date_start     date_end
0    05.01.2017     09.01.2017
...

我需要选择获取我的新date_start和新的date_end与Intersection的所有行。

如果

new date_start = 01.01.2017 and new date_end  10.01.2017
or new date_start = 06.01.2017 and new date_end  06.01.2017
or new date_start = 01.01.2017 and new date_end  06.01.2017
or new date_start = 08.01.2017 and new date_end  10.01.2017

我需要获取此行,如果

new date_start = 22.12.2016 and new date_end  31.12.2016
or new date_start = 15.01.2017 and new date_end 22.01.2017

我无需选择此行。

enter image description here

我创建选择但不起作用

select *
  from SOME_TABLE t
 where (to_date('02.04.2017', 'dd.MM.yyyy') >= t.date_start AND
       to_date('02.04.2017', 'dd.MM.yyyy') <= t.date_end)
    OR to_date('11.04.2017', 'dd.MM.yyyy') > t.date_start

如果日期不是交叉点,则此选择返回行无关紧要

编辑,如果这个答案:

  

如果开始日期和结束日期可能无序,即可能   那个startA&gt; endA或startB&gt; endB,那你还要检查一下   它们是有序的,这意味着你必须再添加两个   有效性规则:(StartA&lt; = EndB)和(StartB&lt; = EndA)和(StartA&lt; =   EndA)和(StartB&lt; = EndB)或:( StartA&lt; = EndB)和(StartA&lt; = EndA)   和(StartB&lt; = EndA)和(StartB&lt; = EndB)或,(StartA&lt; = Min(EndA,   EndB)和(StartB&lt; = Min(EndA,EndB))或:( Max(StartA,StartB)&lt; =   Min(EndA,EndB)

如何重新制作我喜欢的选择?

1 个答案:

答案 0 :(得分:-1)

两个日期范围intersect如果一个在另一个结束之前开始(start1 < end2),它也会在另一个开始之后结束(end1 > start2)。因此,这将获得不与表中其他行相关的行:

SELECT *
FROM   some_table t
WHERE  NOT EXISTS (
  SELECT 1
  FROM   some_table x
  WHERE  x.start_date < t.end_date
  AND    x.end_date   > t.start_date
)

如果你需要考虑相交的范围,如果一个人开始于与另一个人相同的日期和时间,那么将条件从< / >更改为<= / {{1 }}

如果您只想考虑与给定日期范围相交/不相交的行,则获取不相交的范围:

>=

获得交叉范围:

SELECT *
FROM   some_table
WHERE  end_date   <= :your_start_date
OR     start_date >= :your_end_date

<强>更新

  

如果开始和结束日期可能无序

使用SELECT * FROM some_table WHERE end_date > :your_start_date AND start_date < :your_end_date 获取较低的值,使用LEAST( start_date, end_date )获取较高的值。即您可以将第一个查询更改为:

GREATEST( start_date, end_date )