Re: checking the gaps in intervals - Mailing list pgsql-sql
From | Gavin Flower |
---|---|
Subject | Re: checking the gaps in intervals |
Date | |
Msg-id | 5070A979.4070208@archidevsys.co.nz Whole thread Raw |
In response to | checking the gaps in intervals (Anton Gavazuk <antongavazuk@gmail.com>) |
List | pgsql-sql |
<div class="moz-cite-prefix">On 06/10/12 11:42, Anton Gavazuk wrote:<br /></div><blockquote cite="mid:-3205649711969780110@unknownmsgid"type="cite"><pre wrap="">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 </pre></blockquote> If the periods _NEVER_ overlap, you can also use this this approach<br /> (N.B. The indexing of the periodtable here, can be used in my previous solution where I had not considered the indexing seriously!)<br /><br /> Cheers,<br/> Gavin<br /><br /><small><small><font face="monospace">DROP TABLE IF EXISTS period;<br /> DROP TABLE IF EXISTStarget;<br /><br /> CREATE TABLE period<br /> (<br /> start_date date,<br /> end_date date,<br /> <br/> PRIMARY KEY (start_date, end_date)<br /> );<br /><br /> CREATE INDEX ON period (end_date);<br /><br /><br /> INSERTINTO period (start_date, end_date) VALUES<br /> ('2012-11-21', '2012-11-29'),<br /> ('2012-12-01', '2012-12-10'),<br/> ('2012-12-11', '2012-12-13'),<br /> ('2012-12-17', '2012-12-19'),<br /> ('2012-12-20', '2012-12-25');<br/><br /> TABLE period;<br /><br /><br /> CREATE TABLE target<br /> (<br /> start_date date,<br /> end_date date<br /> );<br /><br /><br /> INSERT INTO target (start_date, end_date) VALUES<br /> ('2012-12-01', '2012-12-01'),<br/> ('2012-12-02', '2012-12-02'),<br /> ('2012-12-09', '2012-12-09'),<br /> ('2012-12-10', '2012-12-10'),<br/> ('2012-12-01', '2012-12-09'),<br /> ('2012-12-01', '2012-12-10'),<br /> ('2012-12-01', '2012-12-12'),<br/> ('2012-12-01', '2012-12-13'),<br /> ('2012-12-02', '2012-12-09'),<br /> ('2012-12-02', '2012-12-12'),<br/> ('2012-12-03', '2012-12-11'),<br /> ('2012-12-02', '2012-12-13'),<br /> ('2012-12-02', '2012-12-15'),<br/> ('2012-12-01', '2012-12-18');<br /><br /> SELECT<br /> t.start_date,<br /> t.end_date<br /> FROM<br/> target t<br /> ORDER BY<br /> t.start_date,<br /> t.end_date <br /> /**/;/**/<br /><br /><br />SELECT<br /> t1.start_date AS "Target Start",<br /> t1.end_date AS "Target End",<br /> (t1.end_date - t1.start_date)+ 1 AS "Duration",<br /> p1.start_date AS "Period Start",<br /> p1.end_date AS "Period End"<br /> FROM<br/> target t1,<br /> period p1<br /> WHERE<br /> (<br /> SELECT<br /> SUM<br /> (<br /> CASE <br /> WHEN p2.end_date > t1.end_date <br /> THEN p2.end_date - (p2.end_date - t1.end_date)<br /> ELSE p2.end_date<br /> END<br /> -<br /> CASE <br /> WHEN p2.start_date <t1.start_date<br /> THEN p2.start_date + (t1.start_date - p2.start_date)<br /> ELSE p2.start_date<br /> END <br /> + 1<br /> ) <br /> FROM<br /> period p2<br /> WHERE<br /> p2.start_date <= t1.end_date<br /> AND p2.end_date >= t1.start_date<br /> ) = (t1.end_date - t1.start_date) + 1<br /> AND p1.start_date<= t1.end_date<br /> AND p1.end_date >= t1.start_date<br /> ORDER BY<br /> t1.start_date,<br /> t1.end_date,<br /> p1<small><small><font face="monospace">.start_date</font></small></small></font></small></small><br/><small><small><font face="monospace">/**/;/**/<br/></font></small></small><br />