Received: from localhost (unknown [200.46.204.183]) by postgresql.org (Postfix) with ESMTP id 99AB32E2F3A for ; Fri, 14 Mar 2008 10:58:43 -0300 (ADT) Received: from postgresql.org ([200.46.204.71]) by localhost (mx1.hub.org [200.46.204.183]) (amavisd-maia, port 10024) with ESMTP id 37731-01 for ; Fri, 14 Mar 2008 10:58:35 -0300 (ADT) X-Greylist: from auto-whitelisted by SQLgrey-1.7.5 Received: from tomts40-srv.bellnexxia.net (tomts40.bellnexxia.net [209.226.175.97]) by postgresql.org (Postfix) with ESMTP id 736532E2E53 for ; Fri, 14 Mar 2008 10:58:35 -0300 (ADT) Received: from toip6.srvr.bell.ca ([209.226.175.125]) by tomts40-srv.bellnexxia.net (InterMail vM.5.01.06.13 201-253-122-130-113-20050324) with ESMTP id <20080314135834.HMBT1625.tomts40-srv.bellnexxia.net@toip6.srvr.bell.ca> for ; Fri, 14 Mar 2008 09:58:34 -0400 X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: Av0EAPkg2kdBX4fQ/2dsb2JhbACBWqgH Received: from bas3-london14-1096779728.dsl.bell.ca (HELO t60p.bax.ca) ([65.95.135.208]) by toip6.srvr.bell.ca with ESMTP; 14 Mar 2008 09:55:35 -0400 Message-ID: <47DA848A.9000700@sympatico.ca> Date: Fri, 14 Mar 2008 09:58:34 -0400 From: Frank Bax User-Agent: Thunderbird 2.0.0.6 (X11/20070818) MIME-Version: 1.0 To: pgsql-sql@postgresql.org Subject: Re: Counting days ... References: <200803132025.27821.aarni@kymi.com> <200803132209.33914.aarni@kymi.com> <47D98D11.4080406@pinpointresearch.com> <200803141504.54211.aarni@kymi.com> <47DA8108.1020104@sympatico.ca> In-Reply-To: <47DA8108.1020104@sympatico.ca> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: Maia Mailguard 1.0.1 X-Archive-Number: 200803/82 X-Sequence-Number: 30410 Frank Bax wrote: > Aarni Ruuhimäki wrote: >> Anyway, I have to rethink and elaborate the query. I know that it will >> usually be on a monthly or yearly basis, but a reservation can >> actually be any of the following in relation to the given (arbitrary) >> period: >> >> 1. start_day before period_start, end_day = period_start >> 2. start_day before period_start, end_day in period >> 3. start_day before period_start, end_day = period_end >> 4. start_day = period_start, end_day in period >> 5. start_day in period, end_day in period >> 6. start_day = period_start, end_day = period_end >> 7. start_day in period, end_day = period_end >> 8. start_day in period, end_day after period_end >> 9. start_day = period_start, end_day = period_end >> 10 start_day before period_start, end_day after period_end >> > > > #6 and #9 are the same. You missed these: > > a start_day before period_start, end_day before period_start > b start_day = period_start, end_day = period_start > c start_day = period_start, end_day after period_end > d start_day = period_end, end_day = period_end > e start_day = period_end, end_day after period_end > f start_day after period_end, end_day after period_end > > Granted, a & f should not match where clause; but then groups 10,c,e > don't meet your where clause either. Your where clause should probably be: > > WHERE group_id = 1 AND (res_start_day >= '2007-01-01' AND res_end_day <= > '2008-12-31') > > Are you sure that your database does not have any rows where start_day > is after end_day? These rows could certainly skew results. > > I would suggest that you identify a few rows that meet each of these > conditions. Change the where clause to select rows in one group at a > time. You might consider using a unique row identifier in where clause > during these tests to make sure you are processing the rows you think > you are. When all test cases work properly; then run your generalized > query again. > Change 10,c,e to 8,10,c,e - Group 8 also does not meet your initial WHERE clause. My suggestion for WHERE clause also does not work. This might work better (although it still could be wrong): WHERE group_id = 1 AND (res_start_day BETWEEN '2007-01-01' AND '2008-12-31' OR res_end_day BETWEEN '2007-01-01' AND '2008-12-31') In case I still have it wrong, try each test group separately and you'll soon find out if the WHERE clause is correct or not.