]> granicus.if.org Git - postgresql/commitdiff
Per a brief conversation with Tom, I've created a patch for adding
authorBruce Momjian <bruce@momjian.us>
Fri, 5 Mar 2004 02:41:14 +0000 (02:41 +0000)
committerBruce Momjian <bruce@momjian.us>
Fri, 5 Mar 2004 02:41:14 +0000 (02:41 +0000)
support for 'week' within the date_trunc function.

Within the patch I added a couple of test cases and associated target
output, and changed the documentation to add 'week' appropriately.

Robert Creager

doc/src/sgml/func.sgml
src/backend/utils/adt/timestamp.c
src/test/regress/expected/timestamp.out
src/test/regress/expected/timestamptz.out
src/test/regress/sql/timestamp.sql
src/test/regress/sql/timestamptz.sql

index 66dae9bbdded1e14338bb1f576d70aff71a29587..6c3856d26f76caa203deeafa0ce30cf507ba8269 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.190 2004/03/04 20:09:29 dennis Exp $
+$PostgreSQL: pgsql/doc/src/sgml/func.sgml,v 1.191 2004/03/05 02:41:14 momjian Exp $
 PostgreSQL documentation
 -->
 
@@ -5309,6 +5309,7 @@ date_trunc('<replaceable>field</replaceable>', <replaceable>source</replaceable>
      <member><literal>minute</literal></member>
      <member><literal>hour</literal></member>
      <member><literal>day</literal></member>
+     <member><literal>week</literal></member>
      <member><literal>month</literal></member>
      <member><literal>year</literal></member>
      <member><literal>decade</literal></member>
index ad79025ebc025bd5e0c6138341ce6bc92f55e06a..4fb5f743b03ff6382f25bdaec814d9e5b42a1096 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.99 2004/02/14 20:16:17 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.100 2004/03/05 02:41:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2564,6 +2564,13 @@ timestamp_trunc(PG_FUNCTION_ARGS)
 
                switch (val)
                {
+                       case DTK_WEEK:
+                               isoweek2date( date2isoweek( tm->tm_year, tm->tm_mon, tm->tm_mday ), &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday) );
+                               tm->tm_hour = 0;
+                               tm->tm_min = 0;
+                               tm->tm_sec = 0;
+                               fsec = 0;
+                               break;
                        case DTK_MILLENNIUM:
                                tm->tm_year = (tm->tm_year / 1000) * 1000;
                        case DTK_CENTURY:
@@ -2672,6 +2679,13 @@ timestamptz_trunc(PG_FUNCTION_ARGS)
 
                switch (val)
                {
+                       case DTK_WEEK:
+                               isoweek2date( date2isoweek( tm->tm_year, tm->tm_mon, tm->tm_mday ), &(tm->tm_year), &(tm->tm_mon), &(tm->tm_mday) );
+                               tm->tm_hour = 0;
+                               tm->tm_min = 0;
+                               tm->tm_sec = 0;
+                               fsec = 0;
+                               break;
                        case DTK_MILLENNIUM:
                                tm->tm_year = (tm->tm_year / 1000) * 1000;
                        case DTK_CENTURY:
index f037d576ec88892a702013c9b888ba6271a0f07a..7557bf2900e8718756be4d01ae813348472a5d4f 100644 (file)
@@ -499,6 +499,12 @@ SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
     | @ 1460 days 17 hours 32 mins 1 sec
 (54 rows)
 
+SELECT '' AS date_trunc_week, date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc;
+ date_trunc_week |        week_trunc        
+-----------------+--------------------------
+                 | Mon Feb 23 00:00:00 2004
+(1 row)
+
 -- Test casting within a BETWEEN qualifier
 SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
   FROM TIMESTAMP_TBL
index a76e09a0f544be3bac2a994d4db161f836a41fa9..8a9bccf0a34d10230c199830fcd1936c6aa1b78e 100644 (file)
@@ -494,6 +494,12 @@ SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
     | @ 1460 days 17 hours 32 mins 1 sec
 (54 rows)
 
+SELECT '' AS date_trunc_week, date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc;
+ date_trunc_week |          week_trunc          
+-----------------+------------------------------
+                 | Mon Feb 23 00:00:00 2004 PST
+(1 row)
+
 -- Test casting within a BETWEEN qualifier
 SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
   FROM TIMESTAMPTZ_TBL
@@ -1317,9 +1323,9 @@ SELECT '' AS to_char_9, to_char(d1, 'YYYY A.D. YYYY a.d. YYYY bc HH:MI:SS P.M. H
            | 2001 A.D. 2001 a.d. 2001 ad 05:32:01 P.M. 05:32:01 p.m. 05:32:01 pm
 (64 rows)
 
-SELECT '' AS to_char_10, to_char(d1, 'YYYY WW IYYY IYY IY I IW')
+SELECT '' AS to_char_10, to_char(d1, 'YYYY WW IYYY IYY IY I IW') 
    FROM TIMESTAMPTZ_TBL;
- to_char_10 |     to_char
+ to_char_10 |         to_char          
 ------------+--------------------------
             | 
             | 
index 48a9151a703a8e22ef166b57906dbfa3500ec104..ceda76f546a9617fcd0cef8deeabd27260aa53d1 100644 (file)
@@ -151,6 +151,8 @@ SELECT '' AS "49", d1 FROM TIMESTAMP_TBL
 SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
    FROM TIMESTAMP_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
 
+SELECT '' AS date_trunc_week, date_trunc( 'week', timestamp '2004-02-29 15:44:17.71393' ) AS week_trunc;
+
 -- Test casting within a BETWEEN qualifier
 SELECT '' AS "54", d1 - timestamp without time zone '1997-01-02' AS diff
   FROM TIMESTAMP_TBL
index 2a789b87bd259f9e4f6c2f422a78a5fa2759517d..12572fa7ce44e3eb87cd4662db077296e194b71b 100644 (file)
@@ -145,6 +145,8 @@ SELECT '' AS "49", d1 FROM TIMESTAMPTZ_TBL
 SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
    FROM TIMESTAMPTZ_TBL WHERE d1 BETWEEN '1902-01-01' AND '2038-01-01';
 
+SELECT '' AS date_trunc_week, date_trunc( 'week', timestamp with time zone '2004-02-29 15:44:17.71393' ) AS week_trunc;
+
 -- Test casting within a BETWEEN qualifier
 SELECT '' AS "54", d1 - timestamp with time zone '1997-01-02' AS diff
   FROM TIMESTAMPTZ_TBL