0

我想过滤掉不在表 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))) ```
4

1 回答 1

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, '[]'))

如果您想从范围中排除例如右边缘,请使用'[)'而不是'[]'

于 2019-08-12T19:20:44.747 回答