Psy*_*che 30 sql postgresql date overlap
我有下表:
+-----------+-----------+------------+----------+
| id        | user_id   | start_date | end_date |
| (integer) | (integer) | (date)     | (date)   |
+-----------+-----------+------------+----------+
字段start_date并end_date保持日期值,如YYYY-MM-DD.
此表中的条目如下所示:(1, 120, 2012-04-09, 2012-04-13).
我必须编写一个查询,可以获取匹配特定时间段的所有结果.
问题是,如果我想从获取的结果2012-01-01来2012-04-12,我得到0的结果即使是一个条目start_date = "2012-04-09"和end_date = "2012-04-13".
Mar*_*ani 52
 SELECT *
   FROM mytable
  WHERE (start_date, end_date) OVERLAPS ('2012-01-01'::DATE, '2012-04-12'::DATE);
日期时间函数是文档中的相关部分.
Erw*_*ter 29
假设你想要所有" 重叠 "的时间段,即所有至少有一天共同的时间段.
尝试在直线时间线上设想时间段并在眼前移动它们,您将看到必要的条件.
SELECT *
FROM   tbl
WHERE  start_date <= '2012-04-12'::date
AND    end_date   >= '2012-01-01'::date;
对我来说,这有时候比OVERLAPS这更快- 这是另一种好方法(正如@Marco已经提供的那样).
请注意细微差别(每个文档):
OVERLAPS自动将该对的较早值作为开始.每个时间段被认为代表半开时间间隔start <= time < end,除非开始和结束相等,在这种情况下它代表单个时刻.这意味着例如仅具有共同端点的两个时间段不重叠.
大胆强调我的.
对于大表,正确的索引可以帮助提高性能(很多).
CREATE INDEX tbl_date_inverse_idx ON tbl(start_date, end_date DESC);
如果您有其他选择条件,可能还有另一个(主要)索引列.
请注意两列的反向顺序.详细说明:
Chr*_*ris 20
只是有同样的问题,并以这种方式回答,如果这可以帮助.
select * 
from table
where start_date between '2012-01-01' and '2012-04-13'
or    end_date   between '2012-01-01' and '2012-04-13'