pg.ddx.io  pgsql-sql@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Mark Dilger <pgsql@markdilger.com>
To: Mark Dilger <pgsql@markdilger.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>
Subject: Re: [SQL] Interval subtracting
Date: Wed, 01 Mar 2006 10:06:37 -0800
Message-ID: <4405E2AD.6030404@markdilger.com> (raw)
In-Reply-To: <4405D445.4000200@markdilger.com>
References: <200602181444.06009.milorad.poluga@cores.co.yu>
	<43F72E27.2060408@radev.net>
	<200602181536.20605.milorad.poluga@cores.co.yu>
	<43F7330E.1060907@radev.net>
	<20402.1140287414@sss.pgh.pa.us>
	<4405D445.4000200@markdilger.com>

Mark Dilger wrote:
> Tom Lane wrote:
> 
>> "Milen A. Radev" <milen@radev.net> writes:
>>
>>> Milorad Poluga написа:
>>>
>>>>> SELECT '10 years 1 mons 1 days'::interval - '9 years 10 mons 15 
>>>>> days'::interval
>>>>> ?column?        --------------- 3 mons -14 days
>>>>> Why not '2 mons  16 days' ? 
>>
>>
>>
>>> Please read the last paragraph in section 8.5.1.4 of the manual
>>> (http://www.postgresql.org/docs/8.1/static/datatype-datetime.html#AEN4775) 
>>>
>>> . It mentions the functions named "justify_days" and "justify_hours"
>>> that could do what you need.
>>
>>
>>
>> justify_days doesn't currently do anything with this result --- it
>> thinks its charter is only to reduce day components that are >= 30 days.
>> However, I think a good case could be made that it should normalize
>> negative days too; that is, the invariant on its result should be
>> 0 <= days < 30, not merely days < 30.  Similarly for justify_hours.
>> Comments anyone?  Patch anyone?
> 
> 
> Sure, if nobody objects to this change I can write the patch.
> 
> mark

I've modified the code and it now behaves as follows:

   select justify_days('3 months -12 days'::interval);
     justify_days
   ----------------
    2 mons 18 days

   select justify_days('3 months -33 days'::interval);
    justify_days
   ---------------
    1 mon 27 days

   select justify_hours('3 months -33 days -12 hours'::interval);
          justify_hours
   ---------------------------
    3 mons -34 days +12:00:00

   select justify_days(justify_hours('3 months -33 days -12 hours'::interval));
         justify_days
   ------------------------
    1 mon 26 days 12:00:00

   select justify_hours('-73 hours'::interval);
      justify_hours
   -------------------
    -4 days +23:00:00

   select justify_days('-62 days'::interval);
      justify_days
   ------------------
    -3 mons +28 days


I find the last two results somewhat peculiar, as the new functionality pushes 
the negative values upwards (from hours to days, days to months).  Changing '-73 
hours' to '-3 days -1 hour' might be more intuitive?  The '-4 days +23 hours' is 
however consistent with the behavior in the other cases.

Thoughts?  I will package this up into a patch fairly soon.

mark



view thread (62+ messages)  latest in thread

Message-ID: <4405E2AD.6030404@markdilger.com>
Permalink:  ../4405E2AD.6030404@markdilger.com/
Also on:    postgresql.org/message-id/4405E2AD.6030404@markdilger.com

 · 

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: pgsql@markdilger.com, tgl@sss.pgh.pa.us
  Subject: Re: [SQL] Interval subtracting
  In-Reply-To: <4405E2AD.6030404@markdilger.com>

* 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