Re: Understanding years part of Interval

From: Erik Wienhold <ewie(at)ewie(dot)name>
To: Marcos Pegoraro <marcos(at)f10(dot)com(dot)br>, "pgsql-generallists(dot)postgresql(dot)org" <pgsql-general(at)lists(dot)postgresql(dot)org>
Subject: Re: Understanding years part of Interval
Date: 2023-02-06 13:59:11
Message-ID: 1891019909.4271.1675691951281@office.mailbox.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general pgsql-hackers

> On 06/02/2023 12:20 CET Marcos Pegoraro <marcos(at)f10(dot)com(dot)br> wrote:
>
> I was just playing with some random timestamps for a week, for a month,
> for a year ...
>
> select distinct current_date+((random()::numeric)||'month')::interval from generate_series(1,100) order by 1;
> It´s with distinct clause because if you change that 'month' for a 'year'
> it´ll return only 12 rows, instead of 100. So, why years part of interval
> works differently than any other ?
>
> select '1.01 week'::interval; --> 0 years 0 mons 7 days 1 hours 40 mins 48.00 secs
> select '1.01 month'::interval; --> 0 years 1 mons 0 days 7 hours 12 mins 0.00 secs
> select '1.01 year'::interval; --> 1 years 0 mons 0 days 0 hours 0 mins 0.00 secs

Explained in https://www.postgresql.org/docs/15/datatype-datetime.html#DATATYPE-INTERVAL-INPUT:

Field values can have fractional parts: for example, '1.5 weeks' or
'01:02:03.45'. However, because interval internally stores only
three integer units (months, days, microseconds), fractional units
must be spilled to smaller units. Fractional parts of units greater
than months are rounded to be an integer number of months, e.g.
'1.5 years' becomes '1 year 6 mons'. Fractional parts of weeks and
days are computed to be an integer number of days and microseconds,
assuming 30 days per month and 24 hours per day, e.g., '1.75 months'
becomes 1 mon 22 days 12:00:00. Only seconds will ever be shown as
fractional on output.

Internally interval values are stored as months, days, and
microseconds. This is done because the number of days in a month
varies, and a day can have 23 or 25 hours if a daylight savings time
adjustment is involved.

--
Erik

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Philip Semanchuk 2023-02-06 17:04:48 ALTER COLUMN to change GENERATED ALWAYS AS expression?
Previous Message vignesh C 2023-02-06 11:32:31 Re: Support logical replication of DDLs

Browse pgsql-hackers by date

  From Date Subject
Next Message Aleksander Alekseev 2023-02-06 14:03:07 Re: [PATCH] Compression dictionaries for JSONB
Previous Message Nikita Malakhov 2023-02-06 13:38:01 Re: Pluggable toaster