mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-24 18:55:04 +08:00
Use floor() not rint() when reducing precision of fractional seconds in
timestamp_trunc, timestamptz_trunc, and interval_trunc(). This change only affects the float-datetime case; the integer-datetime case already behaved like truncation instead of rounding. Per gripe from Mario Splivalo. This is a pre-existing issue but I'm choosing not to backpatch, because it's such a corner case and there have not been prior complaints. The issue is largely moot anyway given the trend towards integer datetimes.
This commit is contained in:
parent
44886bd878
commit
47386fed46
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.201 2009/06/11 14:49:04 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.202 2009/07/06 20:29:23 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -3338,13 +3338,13 @@ timestamp_trunc(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT64_TIMESTAMP
|
||||
fsec = (fsec / 1000) * 1000;
|
||||
#else
|
||||
fsec = rint(fsec * 1000) / 1000;
|
||||
fsec = floor(fsec * 1000) / 1000;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case DTK_MICROSEC:
|
||||
#ifndef HAVE_INT64_TIMESTAMP
|
||||
fsec = rint(fsec * 1000000) / 1000000;
|
||||
fsec = floor(fsec * 1000000) / 1000000;
|
||||
#endif
|
||||
break;
|
||||
|
||||
@ -3494,12 +3494,12 @@ timestamptz_trunc(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT64_TIMESTAMP
|
||||
fsec = (fsec / 1000) * 1000;
|
||||
#else
|
||||
fsec = rint(fsec * 1000) / 1000;
|
||||
fsec = floor(fsec * 1000) / 1000;
|
||||
#endif
|
||||
break;
|
||||
case DTK_MICROSEC:
|
||||
#ifndef HAVE_INT64_TIMESTAMP
|
||||
fsec = rint(fsec * 1000000) / 1000000;
|
||||
fsec = floor(fsec * 1000000) / 1000000;
|
||||
#endif
|
||||
break;
|
||||
|
||||
@ -3591,12 +3591,12 @@ interval_trunc(PG_FUNCTION_ARGS)
|
||||
#ifdef HAVE_INT64_TIMESTAMP
|
||||
fsec = (fsec / 1000) * 1000;
|
||||
#else
|
||||
fsec = rint(fsec * 1000) / 1000;
|
||||
fsec = floor(fsec * 1000) / 1000;
|
||||
#endif
|
||||
break;
|
||||
case DTK_MICROSEC:
|
||||
#ifndef HAVE_INT64_TIMESTAMP
|
||||
fsec = rint(fsec * 1000000) / 1000000;
|
||||
fsec = floor(fsec * 1000000) / 1000000;
|
||||
#endif
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user