我想过滤掉不在表2的日期范围之间的表1的ID。
表1:
Booking_ID | starts | ends
表2:
ID | starts | ends
试图做这样的事情,但是不能获取正确的结果。似乎这里有问题。
select t1.id, date(t1.starts), date(t1.ends) from t1
where exists (select *
from t2
where (date(t2.starts) not between date(t1.starts) and date(t1.ends)) or
(date(t2.ends) not between date(t1.starts) and date(t1.ends)) or
(date(t1.starts) not between date(t2.starts) and date(t2.ends))) ```
答案 0 :(得分:1)
您可以使用overlaps
:
select t1.*
from table1 t1
where exists (select *
from t2
where (t1.starts, t1.ends) overlaps (t2.starts, t2.ends));
如果这些是timestamp
列,而您只想考虑date
值,则将这些值转换为日期:
select t1.*
from table1 t1
where exists (select *
from t2
where (t1.starts::date, t1.ends::date) overlaps (t2.starts::date, t2.ends::date));
或者,您可以使用daterange()
来控制是否应该包括右边缘:
select t1.*
from table1 t1
where exists (select *
from t2
where daterange(t1.starts::date, t1.ends::date, '[]') && daterange(t2.starts::date, t2.ends, '[]'))
例如,如果要排除在范围的右边缘,请使用'[)'
代替'[]'