pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Gavin Flower <GavinFlower@archidevsys.co.nz>
To: Anton Gavazuk <antongavazuk@gmail.com>
Cc: pgsql-sql@postgresql.org
Subject: Re: checking the gaps in intervals
Date: Sun, 07 Oct 2012 10:58:17 +1300
Message-ID: <5070A979.4070208@archidevsys.co.nz> (raw)
In-Reply-To: <-3205649711969780110@unknownmsgid>
References: <-3205649711969780110@unknownmsgid>

On 06/10/12 11:42, Anton Gavazuk wrote:
> Hi dear community,
>
> Have probably quite simple task but cannot find the solution,
>
> Imagine the table A with 2 columns start and end, data type is date
>
> start          end
> 01 dec.     10 dec
> 11 dec.     13 dec
> 17 dec.     19 dec
> .....
>
> If I have interval, for example, 12 dec-18 dec, how can I determine
> that the interval cannot be fully covered by values from table A
> because of the gap 14-16 dec? Looking for solution and unfortunately
> nothing has come to the mind yet...
>
> Thanks,
> Anton
>
>
If the periods _NEVER_ overlap, you can also use this this approach
(N.B. The indexing of the period table here, can be used in my previous 
solution where I had not considered the indexing seriously!)

Cheers,
Gavin

DROP TABLE IF EXISTS period;
DROP TABLE IF EXISTS target;

CREATE TABLE period
(
     start_date  date,
     end_date    date,

     PRIMARY KEY (start_date, end_date)
);

CREATE INDEX ON period (end_date);


INSERT INTO period (start_date, end_date) VALUES
('2012-11-21', '2012-11-29'),
('2012-12-01', '2012-12-10'),
('2012-12-11', '2012-12-13'),
('2012-12-17', '2012-12-19'),
('2012-12-20', '2012-12-25');

TABLE period;


CREATE TABLE target
(
     start_date  date,
     end_date    date
);


INSERT INTO target (start_date, end_date) VALUES
('2012-12-01', '2012-12-01'),
('2012-12-02', '2012-12-02'),
('2012-12-09', '2012-12-09'),
('2012-12-10', '2012-12-10'),
('2012-12-01', '2012-12-09'),
('2012-12-01', '2012-12-10'),
('2012-12-01', '2012-12-12'),
('2012-12-01', '2012-12-13'),
('2012-12-02', '2012-12-09'),
('2012-12-02', '2012-12-12'),
('2012-12-03', '2012-12-11'),
('2012-12-02', '2012-12-13'),
('2012-12-02', '2012-12-15'),
('2012-12-01', '2012-12-18');

SELECT
     t.start_date,
     t.end_date
FROM
     target t
ORDER BY
     t.start_date,
     t.end_date
/**/;/**/


SELECT
     t1.start_date AS "Target Start",
     t1.end_date AS "Target End",
     (t1.end_date - t1.start_date) + 1 AS "Duration",
     p1.start_date AS "Period Start",
     p1.end_date AS "Period End"
FROM
     target t1,
     period p1
WHERE
     (
         SELECT
             SUM
             (
                 CASE
                     WHEN p2.end_date > t1.end_date
                         THEN p2.end_date - (p2.end_date - t1.end_date)
                         ELSE p2.end_date
                 END
                 -
                 CASE
                     WHEN p2.start_date < t1.start_date
                         THEN p2.start_date + (t1.start_date - 
p2.start_date)
                         ELSE p2.start_date
                 END
                 + 1
             )
         FROM
             period p2
         WHERE
                 p2.start_date <= t1.end_date
             AND p2.end_date >= t1.start_date
     ) = (t1.end_date - t1.start_date) + 1
     AND p1.start_date <= t1.end_date
     AND p1.end_date >= t1.start_date
ORDER BY
     t1.start_date,
     t1.end_date,
     p1.start_date
/**/;/**/

view thread (7+ messages)  latest in thread

Message-ID: <5070A979.4070208@archidevsys.co.nz>
Permalink:  ../5070A979.4070208@archidevsys.co.nz/
Also on:    postgresql.org/message-id/5070A979.4070208@archidevsys.co.nz

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-sql@postgresql.org
  Cc: GavinFlower@archidevsys.co.nz, antongavazuk@gmail.com
  Subject: Re: checking the gaps in intervals
  In-Reply-To: <5070A979.4070208@archidevsys.co.nz>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox