mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-28 01:30:29 +08:00
Move time_bucket epoch to a Monday
Since Monday is the ISO start of the week, it makes sense to move the time_bucket epoch to start on a Monday. Before the epoch was the same as the Postgres epoch (2000-01-01, a Saturday).
This commit is contained in:
parent
ba88f481cf
commit
e74be30925
31
src/utils.c
31
src/utils.c
@ -283,10 +283,24 @@ ts_timestamp_bucket(PG_FUNCTION_ARGS)
|
|||||||
Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
|
Timestamp timestamp = PG_GETARG_TIMESTAMP(1);
|
||||||
Timestamp result;
|
Timestamp result;
|
||||||
int64 period = -1;
|
int64 period = -1;
|
||||||
|
/* The offset moves the epoch to start on a monday the default postgres epoch starts on a saturday.
|
||||||
|
* This makes time-buckets by a week more intuitive.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
|
int64 offset = 2*USECS_PER_DAY;
|
||||||
|
#else
|
||||||
|
double offset = 2*SECS_PER_DAY;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (TIMESTAMP_NOT_FINITE(timestamp))
|
if (TIMESTAMP_NOT_FINITE(timestamp))
|
||||||
PG_RETURN_TIMESTAMP(timestamp);
|
PG_RETURN_TIMESTAMP(timestamp);
|
||||||
|
|
||||||
|
if(timestamp < DT_NOBEGIN + offset)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||||
|
errmsg("timestamp out of range")));
|
||||||
|
timestamp -= offset;
|
||||||
|
|
||||||
period = get_interval_period_timestamp_units(interval);
|
period = get_interval_period_timestamp_units(interval);
|
||||||
/* result = (timestamp / period) * period */
|
/* result = (timestamp / period) * period */
|
||||||
TMODULO(timestamp, result, period);
|
TMODULO(timestamp, result, period);
|
||||||
@ -304,6 +318,7 @@ ts_timestamp_bucket(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
result *= period;
|
result *= period;
|
||||||
}
|
}
|
||||||
|
result += offset;
|
||||||
PG_RETURN_TIMESTAMP(result);
|
PG_RETURN_TIMESTAMP(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,10 +330,25 @@ ts_timestamptz_bucket(PG_FUNCTION_ARGS)
|
|||||||
TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
|
TimestampTz timestamp = PG_GETARG_TIMESTAMPTZ(1);
|
||||||
TimestampTz result;
|
TimestampTz result;
|
||||||
int64 period = -1;
|
int64 period = -1;
|
||||||
|
/* The offset moves the epoch to start on a monday the default postgres epoch starts on a saturday.
|
||||||
|
* This makes time-buckets by a week more intuitive.
|
||||||
|
*/
|
||||||
|
#ifdef HAVE_INT64_TIMESTAMP
|
||||||
|
int64 offset = 2*USECS_PER_DAY;
|
||||||
|
#else
|
||||||
|
double offset = 2*SECS_PER_DAY;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (TIMESTAMP_NOT_FINITE(timestamp))
|
if (TIMESTAMP_NOT_FINITE(timestamp))
|
||||||
PG_RETURN_TIMESTAMPTZ(timestamp);
|
PG_RETURN_TIMESTAMPTZ(timestamp);
|
||||||
|
|
||||||
|
if(timestamp < DT_NOBEGIN + offset)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE),
|
||||||
|
errmsg("timestamp out of range")));
|
||||||
|
|
||||||
|
timestamp -= offset;
|
||||||
|
|
||||||
period = get_interval_period_timestamp_units(interval);
|
period = get_interval_period_timestamp_units(interval);
|
||||||
/* result = (timestamp / period) * period */
|
/* result = (timestamp / period) * period */
|
||||||
TMODULO(timestamp, result, period);
|
TMODULO(timestamp, result, period);
|
||||||
@ -336,6 +366,7 @@ ts_timestamptz_bucket(PG_FUNCTION_ARGS)
|
|||||||
{
|
{
|
||||||
result *= period;
|
result *= period;
|
||||||
}
|
}
|
||||||
|
result += offset;
|
||||||
PG_RETURN_TIMESTAMPTZ(result);
|
PG_RETURN_TIMESTAMPTZ(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -404,12 +404,12 @@ psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
|||||||
psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
||||||
btime | value
|
btime | value
|
||||||
------------------------------+-------
|
------------------------------+-------
|
||||||
Wed Mar 01 16:00:00 2017 PST | 22.5
|
Fri Mar 03 16:00:00 2017 PST | 22.5
|
||||||
Fri Mar 31 17:00:00 2017 PDT |
|
Sun Apr 02 17:00:00 2017 PDT |
|
||||||
Sun Apr 30 17:00:00 2017 PDT | 25.7
|
Tue May 02 17:00:00 2017 PDT | 25.7
|
||||||
Tue May 30 17:00:00 2017 PDT |
|
Thu Jun 01 17:00:00 2017 PDT |
|
||||||
Thu Jun 29 17:00:00 2017 PDT |
|
Sat Jul 01 17:00:00 2017 PDT |
|
||||||
Sat Jul 29 17:00:00 2017 PDT | 34.1
|
Mon Jul 31 17:00:00 2017 PDT | 34.1
|
||||||
(6 rows)
|
(6 rows)
|
||||||
|
|
||||||
-- Create another hypertable to join with
|
-- Create another hypertable to join with
|
||||||
|
@ -434,12 +434,12 @@ psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
|||||||
psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
psql:include/append.sql:166: NOTICE: Stable function now_s() called!
|
||||||
btime | value
|
btime | value
|
||||||
------------------------------+-------
|
------------------------------+-------
|
||||||
Wed Mar 01 16:00:00 2017 PST | 22.5
|
Fri Mar 03 16:00:00 2017 PST | 22.5
|
||||||
Fri Mar 31 17:00:00 2017 PDT |
|
Sun Apr 02 17:00:00 2017 PDT |
|
||||||
Sun Apr 30 17:00:00 2017 PDT | 25.7
|
Tue May 02 17:00:00 2017 PDT | 25.7
|
||||||
Tue May 30 17:00:00 2017 PDT |
|
Thu Jun 01 17:00:00 2017 PDT |
|
||||||
Thu Jun 29 17:00:00 2017 PDT |
|
Sat Jul 01 17:00:00 2017 PDT |
|
||||||
Sat Jul 29 17:00:00 2017 PDT | 34.1
|
Mon Jul 31 17:00:00 2017 PDT | 34.1
|
||||||
(6 rows)
|
(6 rows)
|
||||||
|
|
||||||
-- Create another hypertable to join with
|
-- Create another hypertable to join with
|
||||||
|
@ -677,21 +677,6 @@ FROM unnest(ARRAY[
|
|||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
SELECT time, time_bucket(INTERVAL '4 day', time::date)
|
SELECT time, time_bucket(INTERVAL '4 day', time::date)
|
||||||
FROM unnest(ARRAY[
|
|
||||||
date '2017-11-02',
|
|
||||||
date '2017-11-03',
|
|
||||||
date '2017-11-06',
|
|
||||||
date '2017-11-07'
|
|
||||||
]) AS time;
|
|
||||||
time | time_bucket
|
|
||||||
------------+-------------
|
|
||||||
11-02-2017 | 10-30-2017
|
|
||||||
11-03-2017 | 11-03-2017
|
|
||||||
11-06-2017 | 11-03-2017
|
|
||||||
11-07-2017 | 11-07-2017
|
|
||||||
(4 rows)
|
|
||||||
|
|
||||||
SELECT time, time_bucket(INTERVAL '4 day', time::date, INTERVAL '2 day')
|
|
||||||
FROM unnest(ARRAY[
|
FROM unnest(ARRAY[
|
||||||
date '2017-11-04',
|
date '2017-11-04',
|
||||||
date '2017-11-05',
|
date '2017-11-05',
|
||||||
@ -706,6 +691,100 @@ FROM unnest(ARRAY[
|
|||||||
11-09-2017 | 11-09-2017
|
11-09-2017 | 11-09-2017
|
||||||
(4 rows)
|
(4 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '4 day', time::date, INTERVAL '2 day')
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
date '2017-11-06',
|
||||||
|
date '2017-11-07',
|
||||||
|
date '2017-11-10',
|
||||||
|
date '2017-11-11'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
------------+-------------
|
||||||
|
11-06-2017 | 11-03-2017
|
||||||
|
11-07-2017 | 11-07-2017
|
||||||
|
11-10-2017 | 11-07-2017
|
||||||
|
11-11-2017 | 11-11-2017
|
||||||
|
(4 rows)
|
||||||
|
|
||||||
|
-- 2019-09-24 is a Monday.
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time::date)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
date '2018-09-16',
|
||||||
|
date '2018-09-17',
|
||||||
|
date '2018-09-23',
|
||||||
|
date '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
------------+-------------
|
||||||
|
09-16-2018 | 09-10-2018
|
||||||
|
09-17-2018 | 09-17-2018
|
||||||
|
09-23-2018 | 09-17-2018
|
||||||
|
09-24-2018 | 09-24-2018
|
||||||
|
(4 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '2018-09-16',
|
||||||
|
timestamp without time zone '2018-09-17',
|
||||||
|
timestamp without time zone '2018-09-23',
|
||||||
|
timestamp without time zone '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
--------------------------+--------------------------
|
||||||
|
Sun Sep 16 00:00:00 2018 | Mon Sep 10 00:00:00 2018
|
||||||
|
Mon Sep 17 00:00:00 2018 | Mon Sep 17 00:00:00 2018
|
||||||
|
Sun Sep 23 00:00:00 2018 | Mon Sep 17 00:00:00 2018
|
||||||
|
Mon Sep 24 00:00:00 2018 | Mon Sep 24 00:00:00 2018
|
||||||
|
(4 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp with time zone '2018-09-16',
|
||||||
|
timestamp with time zone '2018-09-17',
|
||||||
|
timestamp with time zone '2018-09-23',
|
||||||
|
timestamp with time zone '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
------------------------------+------------------------------
|
||||||
|
Sun Sep 16 00:00:00 2018 EDT | Sun Sep 09 20:00:00 2018 EDT
|
||||||
|
Mon Sep 17 00:00:00 2018 EDT | Sun Sep 16 20:00:00 2018 EDT
|
||||||
|
Sun Sep 23 00:00:00 2018 EDT | Sun Sep 16 20:00:00 2018 EDT
|
||||||
|
Mon Sep 24 00:00:00 2018 EDT | Sun Sep 23 20:00:00 2018 EDT
|
||||||
|
(4 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp with time zone '-Infinity',
|
||||||
|
timestamp with time zone 'Infinity'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
-----------+-------------
|
||||||
|
-infinity | -infinity
|
||||||
|
infinity | infinity
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '-Infinity',
|
||||||
|
timestamp without time zone 'Infinity'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
-----------+-------------
|
||||||
|
-infinity | -infinity
|
||||||
|
infinity | infinity
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '4714-11-24 01:01:01.0 BC',
|
||||||
|
timestamp without time zone '294276-12-31 23:59:59.9999'
|
||||||
|
]) AS time;
|
||||||
|
time | time_bucket
|
||||||
|
---------------------------------+-----------------------------
|
||||||
|
Mon Nov 24 01:01:01 4714 BC | Mon Nov 24 00:00:00 4714 BC
|
||||||
|
Sun Dec 31 23:59:59.9999 294276 | Mon Dec 25 00:00:00 294276
|
||||||
|
(2 rows)
|
||||||
|
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
--- Test time input functions --
|
--- Test time input functions --
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
@ -400,14 +400,6 @@ FROM unnest(ARRAY[
|
|||||||
]) AS time;
|
]) AS time;
|
||||||
|
|
||||||
SELECT time, time_bucket(INTERVAL '4 day', time::date)
|
SELECT time, time_bucket(INTERVAL '4 day', time::date)
|
||||||
FROM unnest(ARRAY[
|
|
||||||
date '2017-11-02',
|
|
||||||
date '2017-11-03',
|
|
||||||
date '2017-11-06',
|
|
||||||
date '2017-11-07'
|
|
||||||
]) AS time;
|
|
||||||
|
|
||||||
SELECT time, time_bucket(INTERVAL '4 day', time::date, INTERVAL '2 day')
|
|
||||||
FROM unnest(ARRAY[
|
FROM unnest(ARRAY[
|
||||||
date '2017-11-04',
|
date '2017-11-04',
|
||||||
date '2017-11-05',
|
date '2017-11-05',
|
||||||
@ -415,7 +407,57 @@ FROM unnest(ARRAY[
|
|||||||
date '2017-11-09'
|
date '2017-11-09'
|
||||||
]) AS time;
|
]) AS time;
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '4 day', time::date, INTERVAL '2 day')
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
date '2017-11-06',
|
||||||
|
date '2017-11-07',
|
||||||
|
date '2017-11-10',
|
||||||
|
date '2017-11-11'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
-- 2019-09-24 is a Monday.
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time::date)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
date '2018-09-16',
|
||||||
|
date '2018-09-17',
|
||||||
|
date '2018-09-23',
|
||||||
|
date '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '2018-09-16',
|
||||||
|
timestamp without time zone '2018-09-17',
|
||||||
|
timestamp without time zone '2018-09-23',
|
||||||
|
timestamp without time zone '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp with time zone '2018-09-16',
|
||||||
|
timestamp with time zone '2018-09-17',
|
||||||
|
timestamp with time zone '2018-09-23',
|
||||||
|
timestamp with time zone '2018-09-24'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp with time zone '-Infinity',
|
||||||
|
timestamp with time zone 'Infinity'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '-Infinity',
|
||||||
|
timestamp without time zone 'Infinity'
|
||||||
|
]) AS time;
|
||||||
|
|
||||||
|
|
||||||
|
SELECT time, time_bucket(INTERVAL '1 week', time)
|
||||||
|
FROM unnest(ARRAY[
|
||||||
|
timestamp without time zone '4714-11-24 01:01:01.0 BC',
|
||||||
|
timestamp without time zone '294276-12-31 23:59:59.9999'
|
||||||
|
]) AS time;
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
--- Test time input functions --
|
--- Test time input functions --
|
||||||
-------------------------------------
|
-------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user