子选择时间段

时间:2015-10-18 11:38:07

标签: sql postgresql timestamp subquery

我有2列时间戳:

  1. START(例如2015-11-18 10:00)
  2. STOP(例如2015-11-18 22:00)
  3. 我还有日历(事件,忙),它有3列:

    1. What(varchar(50))(例如,喝咖啡休息时间)
    2. START(时间戳)(例如2015-11-18 10:55)
    3. STOP(时间戳)(例如2015-11-18 11:55)
    4. 如何将所有空闲时段作为单个时间戳返回 即

      free time1: 2015-11-18 10:00 - 2015-11-18 10:55  
      free time2: 2015-11-18 11:55 - 2015-11-18 22:00
      

      作为单个postgresql查询?

1 个答案:

答案 0 :(得分:1)

也许你只想要not exists

select ts.*
from timestamps ts
where not exists (select 1
                  from calendar c
                  where ts.start <= c.end and
                        ts.end >= c.start
                 );

您可能需要将不等式调整为严格的不等式,具体取决于您如何定义重叠。注意:您也可以使用overlaps关键字,但我永远不会记住它是否包含端点,这就是我明确写出逻辑的原因。