> forum=> select datetime(now())+'74565 days'::timespan as ido;
> Thu Jan 19 14:07:30 2068
and
> select '12-01-1999'::datetime + '@ 1 month - 1 sec' ;
> Thu Dec 30 23:59:59 1999 EST
I've repaired both problems in both the development and release trees.
Thanks for the reports and analysis. Patch enclosed...
- Thomas
--
Thomas Lockhart lockhart@alumni.caltech.edu
South Pasadena, California*** ../src/backend/utils/adt/dt.c.orig Mon Jan 3 08:27:24 2000
--- ../src/backend/utils/adt/dt.c Mon Jan 3 16:41:08 2000
***************
*** 787,792 ****
--- 787,793 ---- * To add a month, increment the month, and use the same day of month. * Then, if the next month has
fewerdays, set the day of month * to the last day of month.
+ * Lastly, add in the "quantitative time". */ DateTime * datetime_pl_span(DateTime *datetime, TimeSpan *span)
***************
*** 815,826 **** { dt = (DATETIME_IS_RELATIVE(*datetime) ? SetDateTime(*datetime) : *datetime);
- #ifdef ROUND_ALL
- dt = JROUND(dt + span->time);
- #else
- dt += span->time;
- #endif
- if (span->month != 0) { struct tm tt,
--- 816,821 ----
***************
*** 853,858 ****
--- 848,859 ---- DATETIME_INVALID(dt); }
+ #ifdef ROUND_ALL
+ dt = JROUND(dt + span->time);
+ #else
+ dt += span->time;
+ #endif
+ *result = dt; }
***************
*** 2441,2447 **** tm2timespan(struct tm * tm, double fsec, TimeSpan *span) { span->month = ((tm->tm_year * 12) +
tm->tm_mon);
! span->time = ((((((tm->tm_mday * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60) + tm->tm_sec); span->time =
JROUND(span->time+ fsec); return 0;
--- 2442,2451 ---- tm2timespan(struct tm * tm, double fsec, TimeSpan *span) { span->month = ((tm->tm_year * 12) +
tm->tm_mon);
! span->time = ((((((tm->tm_mday * 24.0)
! + tm->tm_hour) * 60.0)
! + tm->tm_min) * 60.0)
! + tm->tm_sec); span->time = JROUND(span->time + fsec); return 0;