]> granicus.if.org Git - postgresql/commitdiff
Use floor() not rint() when reducing precision of fractional seconds in
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Jul 2009 20:29:23 +0000 (20:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 6 Jul 2009 20:29:23 +0000 (20:29 +0000)
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.

src/backend/utils/adt/timestamp.c

index f4687d4ea9c90620cac88a195f6be460d3c50ed5..9c020f2d10ac39935764d1992115c9a6142a2d48 100644 (file)
@@ -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;