Commit b2b6548c authored by Bruce Momjian's avatar Bruce Momjian

Please find attached diffs for documentation and simple regression

tests for the new interval->day changes. I added tests for
justify_hours() and justify_days() to interval.sql, as they take
interval input and produce interval output. If there's a more
appropriate place for them, please let me know.

Michael Glaesemann
parent 5b0bfec4
<!--
$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.273 2005/07/29 14:46:56 momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.274 2005/07/30 14:52:04 momjian Exp $
PostgreSQL documentation
-->
......@@ -4903,6 +4903,24 @@ SELECT SUBSTRING('XY1234Z', 'Y*?([0-9]{1,3})');
such pair.
</para>
<para>
When adding an <type>interval</type> value to (or subtracting an
<type>interval</type> value from) a <type>timestamp with time zone</type>
value, the days component advances (or decrements) the date of the
<type>timestamp with time zone<type> by the indicated number of days.
Across daylight saving time changes (with the session tiem zone set to a
time zone that recognizes DST), this means <literal>interval '1 day'</literal>
does not necessarily equal <literal>interval '24 hours'</literal>.
For example, with the session time zone set to <literal>CST7CDT</literal>
<literal>timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' </literal>
will produce <literal>timestamp with time zone '2005-04-03 12:00-06'</literal>,
while adding <literal>interval '24 hours'</literal> to the same initial
<type>timestamp with time zone</type> produces
<literal>timestamp with time zone '2005-04-03 13:00-06'</literal>, as there is
a change in daylight saving time at <literal>2005-04-03 02:00</literal> in time zone
<literal>CST7CDT</literal>.
</para>
<table id="operators-datetime-table">
<title>Date/Time Operators</title>
......
......@@ -598,6 +598,33 @@ SELECT (timestamp with time zone 'tomorrow' > 'now') as "True";
t
(1 row)
-- timestamp with time zone, interval arithmetic around DST change
SET TIME ZONE 'CST7CDT';
SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' as "Apr 3, 12:00";
Apr 3, 12:00
------------------------------
Sun Apr 03 12:00:00 2005 CDT
(1 row)
SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '24 hours' as "Apr 3, 13:00";
Apr 3, 13:00
------------------------------
Sun Apr 03 13:00:00 2005 CDT
(1 row)
SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '1 day' as "Apr 2, 12:00";
Apr 2, 12:00
------------------------------
Sat Apr 02 12:00:00 2005 CST
(1 row)
SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '24 hours' as "Apr 2, 11:00";
Apr 2, 11:00
------------------------------
Sat Apr 02 11:00:00 2005 CST
(1 row)
RESET TIME ZONE;
SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am";
Jan_01_1994_10am
------------------------------
......
......@@ -228,3 +228,16 @@ select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31
@ 4541 years 4 mons 4 days 17 mins 31 secs
(1 row)
-- test justify_hours() and justify_days()
SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds";
6 mons 5 days 4 hours 3 mins 2 seconds
----------------------------------------
@ 6 mons 5 days 4 hours 3 mins 2 secs
(1 row)
SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds";
7 mons 6 days 5 hours 4 mins 3 seconds
----------------------------------------
@ 7 mons 6 days 5 hours 4 mins 3 secs
(1 row)
......@@ -114,6 +114,15 @@ SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow'
SELECT (timestamp with time zone 'tomorrow' = (timestamp with time zone 'yesterday' + interval '2 days')) as "True";
SELECT (timestamp with time zone 'tomorrow' > 'now') as "True";
-- timestamp with time zone, interval arithmetic around DST change
SET TIME ZONE 'CST7CDT';
SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '1 day' as "Apr 3, 12:00";
SELECT timestamp with time zone '2005-04-02 12:00-07' + interval '24 hours' as "Apr 3, 13:00";
SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '1 day' as "Apr 2, 12:00";
SELECT timestamp with time zone '2005-04-03 12:00-06' - interval '24 hours' as "Apr 2, 11:00";
RESET TIME ZONE;
SELECT timestamptz(date '1994-01-01', time '11:00') AS "Jan_01_1994_10am";
SELECT timestamptz(date '1994-01-01', time '10:00') AS "Jan_01_1994_9am";
SELECT timestamptz(date '1994-01-01', time with time zone '11:00-8') AS "Jan_01_1994_11am";
......
......@@ -69,3 +69,10 @@ select avg(f1) from interval_tbl;
-- test long interval input
select '4 millenniums 5 centuries 4 decades 1 year 4 months 4 days 17 minutes 31 seconds'::interval;
-- test justify_hours() and justify_days()
SELECT justify_hours(interval '6 months 3 days 52 hours 3 minutes 2 seconds') as "6 mons 5 days 4 hours 3 mins 2 seconds";
SELECT justify_days(interval '6 months 36 days 5 hours 4 minutes 3 seconds') as "7 mons 6 days 5 hours 4 mins 3 seconds";
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment