我有桌子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
我无需选择此行。
我创建选择但不起作用
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)
如何重新制作我喜欢的选择?
答案 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 )