我预计从'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自动将该对的较早值作为开始.
我认为最简单的方法是按原样使用重叠运算符,并添加到WHERE子句以专门处理相邻日期.
假设
那么当范围重叠或相邻时,这应该返回一行.
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)
一种解决方法,即它对于您的情况可能有意义也可能没有意义 - 将日期转换为时间戳:
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)
从技术上讲,仅转换第一个周期的端点就足够了,至少对于您给出的示例而言是如此。