*** a/src/backend/utils/adt/datetime.c
--- b/src/backend/utils/adt/datetime.c
***************
*** 2888,2894 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  				{
  					case DTK_MICROSEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += val + fval;
  #else
  						*fsec += (val + fval) * 1e-6;
  #endif
--- 2888,2894 ----
  				{
  					case DTK_MICROSEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += rint(val + fval);
  #else
  						*fsec += (val + fval) * 1e-6;
  #endif
***************
*** 2897,2903 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  
  					case DTK_MILLISEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += (val + fval) * 1000;
  #else
  						*fsec += (val + fval) * 1e-3;
  #endif
--- 2897,2903 ----
  
  					case DTK_MILLISEC:
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += rint((val + fval) * 1000);
  #else
  						*fsec += (val + fval) * 1e-3;
  #endif
***************
*** 2907,2913 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  					case DTK_SECOND:
  						tm->tm_sec += val;
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += fval * 1000000;
  #else
  						*fsec += fval;
  #endif
--- 2907,2913 ----
  					case DTK_SECOND:
  						tm->tm_sec += val;
  #ifdef HAVE_INT64_TIMESTAMP
! 						*fsec += rint(fval * 1000000);
  #else
  						*fsec += fval;
  #endif
***************
*** 2932,2938 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += (fval - sec) * 1000000;
  #else
  							*fsec += fval - sec;
  #endif
--- 2932,2938 ----
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += rint((fval - sec) * 1000000);
  #else
  							*fsec += fval - sec;
  #endif
***************
*** 2950,2956 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += (fval - sec) * 1000000;
  #else
  							*fsec += fval - sec;
  #endif
--- 2950,2956 ----
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += rint((fval - sec) * 1000000);
  #else
  							*fsec += fval - sec;
  #endif
***************
*** 2969,2975 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += (fval - sec) * 1000000;
  #else
  							*fsec += fval - sec;
  #endif
--- 2969,2975 ----
  							sec = fval;
  							tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 							*fsec += rint((fval - sec) * 1000000);
  #else
  							*fsec += fval - sec;
  #endif
***************
*** 2995,3001 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  								sec = fval;
  								tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 								*fsec += (fval - sec) * 1000000;
  #else
  								*fsec += fval - sec;
  #endif
--- 2995,3001 ----
  								sec = fval;
  								tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 								*fsec += rint((fval - sec) * 1000000);
  #else
  								*fsec += fval - sec;
  #endif
***************
*** 3022,3028 **** DecodeInterval(char **field, int *ftype, int nf, int range,
  								sec = fval;
  								tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 								*fsec += (fval - sec) * 1000000;
  #else
  								*fsec += fval - sec;
  #endif
--- 3022,3028 ----
  								sec = fval;
  								tm->tm_sec += sec;
  #ifdef HAVE_INT64_TIMESTAMP
! 								*fsec += rint((fval - sec) * 1000000);
  #else
  								*fsec += fval - sec;
  #endif
