Re: truncating timestamps on arbitrary intervals - Mailing list pgsql-hackers
From | John Naylor |
---|---|
Subject | Re: truncating timestamps on arbitrary intervals |
Date | |
Msg-id | CACPNZCvWRHL1cz_GAY-QJb+NpZtbhEHfHqLOpHT5=qgcUOVfAQ@mail.gmail.com Whole thread Raw |
In response to | Re: truncating timestamps on arbitrary intervals (Artur Zakirov <zaartur@gmail.com>) |
Responses |
Re: truncating timestamps on arbitrary intervals
|
List | pgsql-hackers |
On Sun, Mar 15, 2020 at 2:26 PM I wrote: > > To get more logical behavior, perhaps the optional parameter is better > as an offset instead of an origin. Alternatively (or additionally), > the function could do the math on int64 timestamps directly. For v6, I changed the algorithm to use pg_tm for months and years, and int64 for all smaller units. Despite the split, I think it's easier to read now, and certainly shorter. This has the advantage that now mixing units is allowed, as long as you don't mix months/years with days or smaller, which often doesn't make sense and is not very practical. (not yet documented) One consequence of this is that when operating on months/years, and the origin contains smaller units, the smaller units are ignored. Example: select date_trunc_interval('12 months'::interval, timestamp '2012-03-01 01:21:01', timestamp '2011-03-22'); date_trunc_interval --------------------- 2012-03-01 00:00:00 (1 row) Even though not quite a full year has passed, it ignores the days in the origin time and detects a difference in 12 calendar months. That might be fine, although we could also throw an error and say origins must be in the form of 'YYYY-01-01 00:00:00' when truncating on months and/or years. I added a sketch of documentation for the origin parameter and more tests. On Fri, Mar 13, 2020 at 7:48 PM Isaac Morland <isaac.morland@gmail.com> wrote: > I'm confused by this. If my calendars are correct, both 1900-01-02 and 2020-02-11 are Tuesdays. So if the date being adjustedand the origin are both Tuesday, shouldn't the day part be left alone when truncating to 7 days? Also, I'd like toconfirm that the default starting point for 7 day periods (weeks) is Monday, per ISO. This is fixed. select date_trunc_interval('7 days'::interval, timestamp '2020-02-11 01:01:01.0', TIMESTAMP '1900-01-02'); date_trunc_interval --------------------- 2020-02-11 00:00:00 (1 row) select date_trunc_interval('7 days'::interval, d), count(*) from generate_series( '2020-02-01'::timestamp, '2020-03-31', '1 day') d group by 1 order by 1; date_trunc_interval | count ---------------------+------- 2020-01-27 00:00:00 | 2 2020-02-03 00:00:00 | 7 2020-02-10 00:00:00 | 7 2020-02-17 00:00:00 | 7 2020-02-24 00:00:00 | 7 2020-03-02 00:00:00 | 7 2020-03-09 00:00:00 | 7 2020-03-16 00:00:00 | 7 2020-03-23 00:00:00 | 7 2020-03-30 00:00:00 | 2 (10 rows) > Perhaps the starting point for dates should be either 0001-01-01 (the proleptic beginning of the CE calendar) or 2001-01-01(the beginning of the current 400-year repeating cycle of leap years and weeks, and a Monday, giving the appropriateISO result for truncating to 7 day periods). I went ahead with 2001-01-01 for the time being. On Thu, Mar 19, 2020 at 4:20 PM Artur Zakirov <zaartur@gmail.com> wrote: > > =# select date_trunc_interval('1.1 year'::interval, TIMESTAMP > '2020-02-01 01:21:01'); > ERROR: only one interval unit allowed for truncation For any lingering cases like this (i don't see any), maybe an error hint is in order. The following works now, as expected for 1 year 1 month: select date_trunc_interval('1.1 year'::interval, timestamp '2002-05-01 01:21:01'); date_trunc_interval --------------------- 2002-02-01 00:00:0 I'm going to look into implementing timezone while awaiting comments on v6. -- John Naylor https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Attachment
pgsql-hackers by date: