X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 66473D1B1BE for ; Mon, 19 Jul 2004 07:46:53 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 92152-02 for ; Mon, 19 Jul 2004 10:46:51 +0000 (GMT) Received: from dyatel.antar.bryansk.ru (unknown [195.239.214.85]) by svr1.postgresql.org (Postfix) with ESMTP id 0FC29D1B169 for ; Mon, 19 Jul 2004 07:46:47 -0300 (ADT) Received: from fduch by dyatel.antar.bryansk.ru with local (Exim 4.40 (FreeBSD)) id 1BmVfS-000819-S0; Mon, 19 Jul 2004 14:46:46 +0400 Date: Mon, 19 Jul 2004 14:46:46 +0400 From: "Alexander M. Pravking" To: Luis Sousa Cc: Tom Lane , Theodore Petrosky , pgsql-sql@postgresql.org Subject: Re: Problem in age on a dates interval Message-ID: <20040719104646.GH81997@dyatel.antar.bryansk.ru> References: <20040716115215.29699.qmail@web41010.mail.yahoo.com> <20678.1089988447@sss.pgh.pa.us> <40FB8DC2.1080405@ualg.pt> Mime-Version: 1.0 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline In-Reply-To: <40FB8DC2.1080405@ualg.pt> User-Agent: Mutt/1.4.2.1i X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200407/117 X-Sequence-Number: 18369 On Mon, Jul 19, 2004 at 10:00:50AM +0100, Luis Sousa wrote: > I worked around this problem returning the difference between the two > dates, using extract doy from both. > Anyway, this will cause a bug on my code when changing the year. Any ideas? Why don't you use the minus operator? SELECT '2004-05-14 16:00'::timestamp - '2004-02-18 16:00'::timestamp; ?column? ---------- 86 days Or, if you need the age just in days: SELECT extract(day from '2004-05-14 16:00'::timestamp - '2004-02-18 16:00'::timestamp); date_part ----------- 86 or SELECT '2004-05-14 16:00'::date - '2004-02-18 16:00'::date; ?column? ---------- 86 Note that '2004-05-14 16:00'::date is actually '2004-05-14 00:00'::date, so the last two are not always equal. > Tom Lane wrote: > > >Theodore Petrosky writes: > > > > > >>wow.... at first I thought I had my head around a leap > >>year problem so I advanced your query a year.... > >> > >> > > > >I think what's going on here is a difference of interpretation about > >whether an "M months D days" interval means to add the months first > >or the days first. For instance > > > >2005-02-18 plus 2 months = 2005-04-18, plus 24 days = 2005-05-12 > > > >2005-02-18 plus 24 days = 2005-03-14, plus 2 months = 2005-05-14 > > > >The timestamp-plus-interval operator is evidently doing addition the > >first way, but it looks like age() is calculating the difference in a > >way that implicitly corresponds to the second way. > > > >I have some vague recollection that this has come up before, but > >I don't recall whether we concluded that age() needs to be changed > >or not. In any case it's not risen to the top of anyone's to-do list, > >because I see that age() still acts this way in CVS tip. > > > > regards, tom lane -- Fduch M. Pravking