Re: BUG #6124: overlaps

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: BUG #6124: overlaps
Дата
Msg-id 11431.1311173955@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: BUG #6124: overlaps  (hubert depesz lubaczewski <depesz@depesz.com>)
Список pgsql-bugs
hubert depesz lubaczewski <depesz@depesz.com> writes:
> On Wed, Jul 20, 2011 at 06:09:48AM +0000, Ludek Bouska wrote:
>> script
>> select ('20110720'::date,'20110721'::date) overlaps
>> ('20110721'::date,'20110721'::date)
>> gives false.

> docs clearly state the reason:
> http://www.postgresql.org/docs/current/interactive/functions-datetime.html

> 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.

Yeah.  This is an explanation in words of the behavior defined by the
SQL spec.  The actual spec text defines the result of (D1, E1) OVERLAPS
(D2, E2) for the non-interval cases thus:

         3) If D1 is the null value or if E1 < D1, then let S1 = E1 and let
            T1 = D1. Otherwise, let S1 = D1 and let T1 = E1.

         5) If D2 is the null value or if E2 < D2, then let S2 = E2 and let
            T2 = D2. Otherwise, let S2 = D2 and let T2 = E2.

         6) The result of the <overlaps predicate> is the result of the
            following expression:

              ( S1 > S2 AND NOT ( S1 >= T2 AND T1 >= T2 ) )
              OR
              ( S2 > S1 AND NOT ( S2 >= T1 AND T2 >= T1 ) )
              OR
              ( S1 = S2 AND ( T1 <> T2 OR T1 = T2 ) )

If you work through that you'll see that indeed these values should
produce a false result: we have S2 > S1, S2 >= T1, T2 >= T1.

            regards, tom lane

В списке pgsql-bugs по дате отправления:

Предыдущее
От: hubert depesz lubaczewski
Дата:
Сообщение: Re: BUG #6124: overlaps
Следующее
От: "leonardo"
Дата:
Сообщение: BUG #6119: Postgres ODBC Install.msi