mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
Fix (hopefully for the last time) problems with datetime values displaying
like '23:59:60' because of fractional-second roundoff problems. Trying to control this upstream of the actual display code was hopeless; the right way is to explicitly round fractional seconds in the display code and then refigure the results if the fraction rounds up to 1. Per bug #1927.
This commit is contained in:
@@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.120 2005/09/09 02:31:49 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/date.c,v 1.121 2005/10/09 17:21:46 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -944,10 +944,18 @@ time2tm(TimeADT time, struct pg_tm *tm, fsec_t *fsec)
|
||||
#else
|
||||
double trem;
|
||||
|
||||
recalc:
|
||||
trem = time;
|
||||
TMODULO(trem, tm->tm_hour, (double)SECS_PER_HOUR);
|
||||
TMODULO(trem, tm->tm_min, (double)SECS_PER_MINUTE);
|
||||
TMODULO(trem, tm->tm_sec, 1.0);
|
||||
trem = TIMEROUND(trem);
|
||||
/* roundoff may need to propagate to higher-order fields */
|
||||
if (trem >= 1.0)
|
||||
{
|
||||
time = ceil(time);
|
||||
goto recalc;
|
||||
}
|
||||
*fsec = trem;
|
||||
#endif
|
||||
|
||||
@@ -1837,9 +1845,17 @@ timetz2tm(TimeTzADT *time, struct pg_tm *tm, fsec_t *fsec, int *tzp)
|
||||
#else
|
||||
double trem = time->time;
|
||||
|
||||
recalc:
|
||||
TMODULO(trem, tm->tm_hour, (double)SECS_PER_HOUR);
|
||||
TMODULO(trem, tm->tm_min, (double)SECS_PER_MINUTE);
|
||||
TMODULO(trem, tm->tm_sec, 1.0);
|
||||
trem = TIMEROUND(trem);
|
||||
/* roundoff may need to propagate to higher-order fields */
|
||||
if (trem >= 1.0)
|
||||
{
|
||||
trem = ceil(time->time);
|
||||
goto recalc;
|
||||
}
|
||||
*fsec = trem;
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user