Nick Johnson wrote:
> 
> The following bug has been logged online:
> 
> Bug reference:      1749
> Logged by:          Nick Johnson
> Email address:      [EMAIL PROTECTED]
> PostgreSQL version: 8.0.3
> Operating system:   FreeBSD
> Description:        date_trunc('week', ...) is incorrect for some dates
> Details: 
> 
> numa=# SELECT date_trunc('week', '2002-12-31'::date);
>        date_trunc       
> ------------------------
>  2001-12-31 00:00:00-05
> (1 row)
> 
> Obviously this isn't the expected behaviour...

Thanks, patch attached and applied to CVS HEAD and 8.0.X.  When we fixed
January dates that were part of the previous year, I thought their might
be December dates in the next year, but I couldn't find any so I figured
they didn't exist.

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/backend/utils/adt/timestamp.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v
retrieving revision 1.128
diff -c -c -r1.128 timestamp.c
*** src/backend/utils/adt/timestamp.c   30 Jun 2005 03:48:58 -0000      1.128
--- src/backend/utils/adt/timestamp.c   4 Jul 2005 14:02:46 -0000
***************
*** 2793,2801 ****
--- 2793,2804 ----
                                /*
                                 *      If it is week 52/53 and the month is 
January,
                                 *      then the week must belong to the 
previous year.
+                                *      Also, some December dates belong to the 
next year.
                                 */
                                if (woy >= 52 && tm->tm_mon == 1)
                                        --tm->tm_year;
+                               if (woy <= 1 && tm->tm_mon == 12)
+                                       ++tm->tm_year;
                                isoweek2date(woy, &(tm->tm_year), 
&(tm->tm_mon), &(tm->tm_mday));
                                tm->tm_hour = 0;
                                tm->tm_min = 0;
***************
*** 2924,2932 ****
--- 2927,2938 ----
                                /*
                                 *      If it is week 52/53 and the month is 
January,
                                 *      then the week must belong to the 
previous year.
+                                *      Also, some December dates belong to the 
next year.
                                 */
                                if (woy >= 52 && tm->tm_mon == 1)
                                        --tm->tm_year;
+                               if (woy <= 1 && tm->tm_mon == 12)
+                                       ++tm->tm_year;
                                isoweek2date(woy, &(tm->tm_year), 
&(tm->tm_mon), &(tm->tm_mday));
                                tm->tm_hour = 0;
                                tm->tm_min = 0;
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to