Sql 选择new dateStart和new DateEnd不相交的所有行。神谕
我有几张桌子Sql 选择new dateStart和new DateEnd不相交的所有行。神谕,sql,oracle,date,Sql,Oracle,Date,我有几张桌子 id date_start date_end 0 05.01.2017 09.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 我不需要选择这些行 我创建了se
id date_start date_end
0 05.01.2017 09.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,但它不起作用
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
选择*
从某张桌子上
其中(截止日期('2017年4月2日,'yyyy年月日')>=t.date\u开始和
截止日期(“2017年4月2日”、“yyyy年月日”)t日期开始
如果日期不相交,则选择返回行并不重要
编辑此答案:
如果开始和结束日期可能不符合顺序,即,如果可能
那个startA>endA或者startB>endB,那么你也必须检查一下
它们是有序的,因此这意味着您必须再添加两个
有效性规则:(StartA两个日期范围,如果一个开始于另一个结束(start1
)之前,它也在另一个开始(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
)
要获得相交范围,请执行以下操作:
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
它的可能重复部分不称为“交叉点”,而称为“重叠”。
SELECT *
FROM some_table
WHERE end_date > :your_start_date
AND start_date < :your_end_date
SELECT *
FROM some_table t
WHERE NOT EXISTS (
SELECT 1
FROM some_table x
WHERE LEAST( x.start_date, x.end_date ) < GREATEST( t.start_date, t.end_date )
AND GREATEST( x.start_date, x.end_date ) > LEAST( t.start_date, t.end_date )
)