]> granicus.if.org Git - postgresql/commitdiff
Please find attached diffs for documentation and simple regression
authorBruce Momjian <bruce@momjian.us>
Sat, 30 Jul 2005 14:52:04 +0000 (14:52 +0000)
committerBruce Momjian <bruce@momjian.us>
Sat, 30 Jul 2005 14:52:04 +0000 (14:52 +0000)
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

doc/src/sgml/func.sgml
src/test/regress/expected/horology.out
src/test/regress/expected/interval.out
src/test/regress/sql/horology.sql
src/test/regress/sql/interval.sql

index 5c6092e42456518ee7255b1e6b53f7075d2fc02c..55a5a63ae59ec581b1d6ab10b95a5755c11a7025 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$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>
 
index c0a7f6e5b83c6206e782d1c834d4e5e655aaa1b2..fe85c2dfcf486f86ab0453018a6df16a5be216ea 100644 (file)
@@ -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       
 ------------------------------
index 7480e7f2e55ca695ecf8c26565d137ac4876e1a1..9efcdf813954649853100a4ea497c49cde4c2605 100644 (file)
@@ -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)
+
index afc9feb0c802d6e8a03e24d0123f6c450bad3587..d4be1f51d5e9d75584737a35dad6283addde7143 100644 (file)
@@ -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";
index cd17ebbc95ba1ed88303d0507eb1f6cbce6ce6b3..25e58659e7dd5f6f0b43f7db5ff5346c30495f7f 100644 (file)
@@ -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";
+