在两个表格中查找重叠的日期范围?

时间:2019-08-12 19:16:27

标签: postgresql

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

1 个答案:

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

例如,如果要排除在范围的右边缘,请使用'[)'代替'[]'