Index: src/backend/utils/adt/timestamp.c =================================================================== RCS file: /cvsroot/pgsql/src/backend/utils/adt/timestamp.c,v retrieving revision 1.145 diff -c -c -r1.145 timestamp.c *** src/backend/utils/adt/timestamp.c 23 Jul 2005 14:53:21 -0000 1.145 --- src/backend/utils/adt/timestamp.c 23 Jul 2005 19:34:39 -0000 *************** *** 2294,2300 **** { Interval *span = PG_GETARG_INTERVAL_P(0); float8 factor = PG_GETARG_FLOAT8(1); ! double month_remainder, day_remainder; Interval *result; result = (Interval *) palloc(sizeof(Interval)); --- 2294,2300 ---- { Interval *span = PG_GETARG_INTERVAL_P(0); float8 factor = PG_GETARG_FLOAT8(1); ! double month_remainder; Interval *result; result = (Interval *) palloc(sizeof(Interval)); *************** *** 2308,2327 **** result->day = span->day / factor; result->time = span->time / factor; - /* Compute remainders */ - month_remainder = span->month / factor - result->month; - day_remainder = span->day / factor - result->day; - /* Cascade fractions to lower units */ ! /* fractional months full days into days */ result->day += month_remainder * DAYS_PER_MONTH; - /* fractional months partial days into time */ - day_remainder += (month_remainder * DAYS_PER_MONTH) - (int)(month_remainder * DAYS_PER_MONTH); #ifdef HAVE_INT64_TIMESTAMP ! result->time += day_remainder * USECS_PER_DAY; #else ! result->time += day_remainder * SECS_PER_DAY; result->time = JROUND(result->time); #endif --- 2308,2327 ---- result->day = span->day / factor; result->time = span->time / factor; /* Cascade fractions to lower units */ ! month_remainder = (span->month / factor - result->month); result->day += month_remainder * DAYS_PER_MONTH; + /* fractional months and partial days into time */ #ifdef HAVE_INT64_TIMESTAMP ! /* divide by 'factor' at the end to avoid rounding errors */ ! result->time += ((span->day - (int)(span->day * factor) + ! ((span->month - result->month * factor) * DAYS_PER_MONTH)) ! * USECS_PER_DAY) / factor; #else ! result->time += (span->day / factor - (int)(span->day / factor) + ! month_remainder * DAYS_PER_MONTH - ! (int)(month_remainder * DAYS_PER_MONTH)) * SECS_PER_DAY; result->time = JROUND(result->time); #endif