Received: from localhost (maia-4.hub.org [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 97A9F9FA372 for ; Fri, 26 Jan 2007 05:50:18 -0400 (AST) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-new, port 10024) with ESMTP id 07304-04 for ; Fri, 26 Jan 2007 05:50:13 -0400 (AST) X-Greylist: from auto-whitelisted by SQLgrey-1.7.4 Received: from moutng.kundenserver.de (moutng.kundenserver.de [212.227.126.174]) by postgresql.org (Postfix) with ESMTP id E54349FA4D4 for ; Fri, 26 Jan 2007 05:50:11 -0400 (AST) Received: from [194.25.154.138] (helo=webserv.wug.de) by mrelayeu.kundenserver.de (node=mrelayeu3) with ESMTP (Nemesis), id 0MKxQS-1HANij03Dt-00047o; Fri, 26 Jan 2007 10:50:09 +0100 Received: from kretschmer by webserv.wug.de with local (Exim 3.36 #1) id 1HANii-0005hh-00 for pgsql-sql@postgresql.org; Fri, 26 Jan 2007 10:50:08 +0100 Date: Fri, 26 Jan 2007 10:50:08 +0100 From: "A. Kretschmer" To: pgsql-sql@postgresql.org Subject: Re: Intersection of two date interval Message-ID: <20070126095007.GD15591@a-kretschmer.de> References: <49a67b230701260139n1153ee82x8ae91875118f3cd2@mail.gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <49a67b230701260139n1153ee82x8ae91875118f3cd2@mail.gmail.com> X-OS: Debian/GNU Linux - weil ich es mir Wert bin! X-Message-Flag: "Windows" is not the answer. "Windows" is the question and the answer is "no"! User-Agent: Mutt/1.5.9i X-Provags-ID: kundenserver.de abuse@kundenserver.de login:51ea9561fc3f6d9539a2acd743e4748c X-Provags-ID2: V01U2FsdGVkX1/EVH6ROe7kDsYMtsM4mUDn1e8JUOJpdoH0VBkIZIuSLqERPoIFxSepsDDyx0T1JqTZbKvT8yQuj/2Q8HwtoMvQxrTlpbi2C5EbRTBku9Vvup3tf/05yX7l X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200701/131 X-Sequence-Number: 27283 am Fri, dem 26.01.2007, um 11:39:03 +0200 mailte Suha Onay folgendes: > Hi, > > How can i find the number of days in the intersection of 2 date interval? > For example: > 1st interval: (10.01.2007, 20.01.2007) > 2nd interval: (13.01.2007, 21.01.2007) > The intersection dates are: 13,14,15,16,17,18,19, 20 > The result is: 8 > > How can i find the result, 8 in an sql query without using CASE statements? Some time ago i wrote a function for this, i hope it's helpfull for you: (not realy tested, be careful!) create type start_end as (t1 timestamptz, t2 timestamptz); create or replace function time_intersect (timestamptz, timestamptz, timestamptz, timestamptz) returns start_end as $$ declare _s1 alias for $1; _e1 alias for $2; _s2 alias for $3; _e2 alias for $4; _start timestamptz; _end timestamptz; _return start_end; begin if _s1 < _s2 then _start := _s2; else _start := _s1; end if; if _e1 < _e2 then _end := _e1; else _end := _e2; end if; if _start < _end then _return.t1 := _start; _return.t2 := _end; else _return.t1 := NULL; _return.t2 := NULL; end if; return _return; end $$ language plpgsql; test=# set datestyle=german; SET test=*# select time_intersect('10.01.2007'::date, '20.01.2007'::date, '13.01.2007'::date, '21.01.2007'::date); time_intersect ------------------------------------------------------- ("13.01.2007 00:00:00 CET","20.01.2007 00:00:00 CET") (1 row) test=*# select *, t2-t1 from time_intersect('10.01.2007'::date, '20.01.2007'::date, '13.01.2007'::date, '21.01.2007'::date); t1 | t2 | ?column? -------------------------+-------------------------+---------- 13.01.2007 00:00:00 CET | 20.01.2007 00:00:00 CET | @ 7 days (1 row) Andreas -- Andreas Kretschmer Kontakt: Heynitz: 035242/47150, D1: 0160/7141639 (mehr: -> Header) GnuPG-ID: 0x3FFF606C, privat 0x7F4584DA http://wwwkeys.de.pgp.net