Re: "two time periods with only an endpoint in common do not overlap" ??? - Mailing list pgsql-general

From Adrian Klaver
Subject Re: "two time periods with only an endpoint in common do not overlap" ???
Date
Msg-id 2ff5f521-34ab-8690-180a-864441e4f15b@aklaver.com
Whole thread Raw
In response to "two time periods with only an endpoint in common do not overlap" ???  (Bryn Llewellyn <bryn@yugabyte.com>)
Responses Re: "two time periods with only an endpoint in common do not overlap" ???
List pgsql-general
On 10/14/21 16:38, Bryn Llewellyn wrote:
> I’m quoting this from “9.9. Date/Time Functions and Operators” in the PG 
> Version 14 doc on the “overlaps” operator, here:
> 
> www.postgresql.org/docs/14/functions-datetime.html 
> <http://www.postgresql.org/docs/14/functions-datetime.html>
> 
> It’s the same in “current”—and in the Version 11 doc.
> 
>     «
>     This expression yields true when two time periods (defined by their
>     endpoints) overlap, false when they do not overlap. The endpoints
>     can be specified as pairs of dates, times, or time stamps; or as a
>     date, time, or time stamp followed by an interval. When a pair of
>     values is provided, either the start or the end can be written
>     first; OVERLAPS automatically takes the earlier value of the pair as
>     the start. Each time period is considered to represent the half-open
>     interval start <= time < end, unless start and end are equal in
>     which case it represents that single time instant. This means for
>     instance that two time periods with only an endpoint in common do
>     not overlap.
>     »
> 
> 
> I tried this obvious test (using Version 13.4):
> 
> *with c as (
>    select
>      '2000-01-15'::timestamp as start_1,
>      '2000-02-15'::timestamp as start_2,
>      '2000-03-15'::timestamp as common_endpoint)
> select (
>    (start_1, **common_endpoint**) overlaps
>    (start_2, **common_endpoint**)
> )::text
> from c;

This resolves to:

select ('2000-01-15'::timestamp, '2000-03-15'::timestamp) overlaps 
('2000-02-15'::timestamp, '2000-03-15'::timestamp);
  overlaps
----------
  t

which to me looks like an overlap.

What you are referring to is:

select ('2000-01-15'::timestamp, '2000-03-15'::timestamp) overlaps 
('2000-03-15'::timestamp, '2000-03-20'::timestamp);
  overlaps
----------
  f

or the third example in the docs:

SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
        (DATE '2001-10-30', DATE '2002-10-30');
Result: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
        (DATE '2001-10-30', DATE '2002-10-30');
Result: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
        (DATE '2001-10-30', DATE '2001-10-31');
Result: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
        (DATE '2001-10-30', DATE '2001-10-31');
Result: true


> *
> The result is "true". Seems to me that the doc is therefore wrong—not 
> only as shown by this test but also w.r.t. what reasoning from the 
> account at "half-open interval" says.
> 
> Now consider this:
> 
> *with c as (
>    select
>      '2000-01-15'::timestamp as start,
>      '2000-02-15'::timestamp as common_touchpoint,
>      '2000-03-15'::timestamp as endpoint)
> select (
>    (start, **common_touchpoint**) overlaps
>    (**common_touchpoint**, **endpoint**)
> )::text
> from c;
> *
> The result is now "false".  As it seems to me this is correct w.r.t. 
> what reasoning from the account at "half-open interval" says.
> 
> It also seems to me that whenever the doc derives a predicted result 
> from the stated rules, it's honor bound to substantiate this with a code 
> example.
> 


-- 
Adrian Klaver
adrian.klaver@aklaver.com



pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: "two time periods with only an endpoint in common do not overlap" ???
Next
From: "David G. Johnston"
Date:
Subject: Re: "two time periods with only an endpoint in common do not overlap" ???