SQL OVERLAPS运算符问题,如何摆脱它

Mel*_*lon 6 sql postgresql

我预计从'2011-01-28'到'2011-02-01'过期期间的日期从'2011-02-01'到'2011-02-01'(这是同一天),但确实如此不!

期待匹配精确结束点的PostgreSQL不匹配......如何摆脱这个?我想让它将上述场景视为重叠.

SELECT (DATE '2011-01-28', DATE '2011-02-01') OVERLAPS
       (DATE '2011-02-01', DATE '2011-02-01');
Run Code Online (Sandbox Code Playgroud)

返回false,而我希望它返回true.

mu *_*ort 13

你错了.从精细手册:

每个时间段被认为代表半开间隔开始<=时间<结束,除非开始结束相等,在这种情况下它代表单个时刻.这意味着例如仅具有共同端点的两个时间段不重叠.

因此,如果您想要关闭的间隔,启动<= time <= end,那么您可以明确地进行端点检查,如Catcall建议的那样,或者您可以将一天添加到上限:

SELECT (DATE '2011-01-28', DATE '2011-02-01' + 1) OVERLAPS
       (DATE '2011-02-01', DATE '2011-02-01'    )
Run Code Online (Sandbox Code Playgroud)

但要小心将端点按正确顺序排列为:

当提供一对值时,可以首先写入开始或结束; OVERLAPS自动将该对的较早值作为开始.

  • @AndyFaizan:为什么?`date + integer` 是一个日期,`integer` 将被视为天数。此外,`date + interval` 是一个`timestamp`,这可能不是我们想要的。 (2认同)

Mik*_*ll' 8

我认为最简单的方法是按原样使用重叠运算符,并添加到WHERE子句以专门处理相邻日期.

假设

  • (S1,E1)是第一个范围的开始和结束日期,
  • (S2,E2)是第二个范围的开始和结束日期,
  • S1,E1,S2或E2都不为NULL,

那么当范围重叠或相邻时,这应该返回一行.

select S1, E1, S2, E2
from [some table name]
where (S1, E1) overlaps (S2, E2)
   or (E1 = S2)   -- first range ends on the start date of the second
   or (E2 = S1)   -- second range ends on the start date of the first
Run Code Online (Sandbox Code Playgroud)


Mil*_*dev 4

一种解决方法,即它对于您的情况可能有意义也可能没有意义 - 将日期转换为时间戳:

SELECT (TIMESTAMP '2011-01-28 00:00:00', TIMESTAMP '2011-02-01  23:59:59') OVERLAPS (TIMESTAMP '2011-02-01 00:00:00', TIMESTAMP '2011-02-01 23:59:59');
Run Code Online (Sandbox Code Playgroud)

从技术上讲,仅转换第一个周期的端点就足够了,至少对于您给出的示例而言是如此。