Re: [SQL] Interval subtracting

From: Mark Dilger <pgsql(at)markdilger(dot)com>
To: Mark Dilger <pgsql(at)markdilger(dot)com>
Cc: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Subject: Re: [SQL] Interval subtracting
Date: 2006-03-01 18:06:37
Message-ID: 4405E2AD.6030404@markdilger.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers pgsql-patches pgsql-sql

Mark Dilger wrote:
> Tom Lane wrote:
>
>> "Milen A. Radev" <milen(at)radev(dot)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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Jim C. Nasby 2006-03-01 18:24:28 Re: [SQL] Interval subtracting
Previous Message Bruce Momjian 2006-03-01 17:59:29 Re: [SQL] Interval subtracting

Browse pgsql-patches by date

  From Date Subject
Next Message Jim C. Nasby 2006-03-01 18:24:28 Re: [SQL] Interval subtracting
Previous Message Bruce Momjian 2006-03-01 17:59:29 Re: [SQL] Interval subtracting

Browse pgsql-sql by date

  From Date Subject
Next Message Andrew Sullivan 2006-03-01 18:23:45 Re: Help with trigger that updates a row prior to a potentially aborted deletion?
Previous Message Bruce Momjian 2006-03-01 17:59:29 Re: [SQL] Interval subtracting