diff options
| author | Tom Lane | 2023-03-18 18:12:14 +0000 |
|---|---|---|
| committer | Tom Lane | 2023-03-18 18:12:16 +0000 |
| commit | 75bd846b68b09f33a57d9de96064ded4d392ca05 (patch) | |
| tree | 3d5d6df0256c26817c96a0ce6102625523aef6f2 /src/test | |
| parent | 0e681cf0390ddd720424cd134a2c42dffc2934fd (diff) | |
Add functions to do timestamptz arithmetic in a non-default timezone.
Add versions of timestamptz + interval, timestamptz - interval, and
generate_series(timestamptz, ...) in which a timezone can be specified
explicitly instead of defaulting to the TimeZone GUC setting.
The new functions for the first two are named date_add and
date_subtract. This might seem too generic, but we could use
overloading to add additional variants if that seems useful.
Along the way, improve the docs' pretty inadequate explanation
of how timestamptz +- interval works.
Przemysław Sztoch and Gurjeet Singh; cosmetic changes and most of
the docs work by me
Discussion: https://postgr.es/m/01a84551-48dd-1359-bf7e-f6b0203a6bd0@sztoch.pl
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/timestamptz.out | 54 | ||||
| -rw-r--r-- | src/test/regress/sql/timestamptz.sql | 19 |
2 files changed, 73 insertions, 0 deletions
diff --git a/src/test/regress/expected/timestamptz.out b/src/test/regress/expected/timestamptz.out index 91d7c1f5cc2..0dd2fe2c82d 100644 --- a/src/test/regress/expected/timestamptz.out +++ b/src/test/regress/expected/timestamptz.out @@ -2468,6 +2468,60 @@ select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); ERROR: step size cannot equal zero +-- Interval crossing time shift for Europe/Warsaw timezone (with DST) +SET TimeZone to 'UTC'; +SELECT date_add('2022-10-30 00:00:00+01'::timestamptz, + '1 day'::interval); + date_add +------------------------------ + Sun Oct 30 23:00:00 2022 UTC +(1 row) + +SELECT date_add('2021-10-31 00:00:00+02'::timestamptz, + '1 day'::interval, + 'Europe/Warsaw'); + date_add +------------------------------ + Sun Oct 31 23:00:00 2021 UTC +(1 row) + +SELECT date_subtract('2022-10-30 00:00:00+01'::timestamptz, + '1 day'::interval); + date_subtract +------------------------------ + Fri Oct 28 23:00:00 2022 UTC +(1 row) + +SELECT date_subtract('2021-10-31 00:00:00+02'::timestamptz, + '1 day'::interval, + 'Europe/Warsaw'); + date_subtract +------------------------------ + Fri Oct 29 22:00:00 2021 UTC +(1 row) + +SELECT * FROM generate_series('2021-12-31 23:00:00+00'::timestamptz, + '2020-12-31 23:00:00+00'::timestamptz, + '-1 month'::interval, + 'Europe/Warsaw'); + generate_series +------------------------------ + Fri Dec 31 23:00:00 2021 UTC + Tue Nov 30 23:00:00 2021 UTC + Sun Oct 31 23:00:00 2021 UTC + Thu Sep 30 22:00:00 2021 UTC + Tue Aug 31 22:00:00 2021 UTC + Sat Jul 31 22:00:00 2021 UTC + Wed Jun 30 22:00:00 2021 UTC + Mon May 31 22:00:00 2021 UTC + Fri Apr 30 22:00:00 2021 UTC + Wed Mar 31 22:00:00 2021 UTC + Sun Feb 28 23:00:00 2021 UTC + Sun Jan 31 23:00:00 2021 UTC + Thu Dec 31 23:00:00 2020 UTC +(13 rows) + +RESET TimeZone; -- -- Test behavior with a dynamic (time-varying) timezone abbreviation. -- These tests rely on the knowledge that MSK (Europe/Moscow standard time) diff --git a/src/test/regress/sql/timestamptz.sql b/src/test/regress/sql/timestamptz.sql index ae9ee4b56a2..69b36d04202 100644 --- a/src/test/regress/sql/timestamptz.sql +++ b/src/test/regress/sql/timestamptz.sql @@ -459,6 +459,25 @@ select * from generate_series('2020-01-01 00:00'::timestamptz, '2020-01-02 03:00'::timestamptz, '0 hour'::interval); +-- Interval crossing time shift for Europe/Warsaw timezone (with DST) +SET TimeZone to 'UTC'; + +SELECT date_add('2022-10-30 00:00:00+01'::timestamptz, + '1 day'::interval); +SELECT date_add('2021-10-31 00:00:00+02'::timestamptz, + '1 day'::interval, + 'Europe/Warsaw'); +SELECT date_subtract('2022-10-30 00:00:00+01'::timestamptz, + '1 day'::interval); +SELECT date_subtract('2021-10-31 00:00:00+02'::timestamptz, + '1 day'::interval, + 'Europe/Warsaw'); +SELECT * FROM generate_series('2021-12-31 23:00:00+00'::timestamptz, + '2020-12-31 23:00:00+00'::timestamptz, + '-1 month'::interval, + 'Europe/Warsaw'); +RESET TimeZone; + -- -- Test behavior with a dynamic (time-varying) timezone abbreviation. -- These tests rely on the knowledge that MSK (Europe/Moscow standard time) |
