diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c index 8f80d9e..37fe31b 100644 --- a/src/backend/utils/adt/timestamp.c +++ b/src/backend/utils/adt/timestamp.c @@ -746,6 +746,8 @@ float8_timestamptz(PG_FUNCTION_ARGS) { float8 seconds = PG_GETARG_FLOAT8(0); TimestampTz result; + int64 epoch_diff_seconds; + int64 microseconds; /* Deal with NaN and infinite inputs ... */ if (isnan(seconds)) @@ -775,13 +777,15 @@ float8_timestamptz(PG_FUNCTION_ARGS) (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range: \"%g\"", seconds))); + microseconds = (int64)(seconds * USECS_PER_SEC); + /* Convert UNIX epoch to Postgres epoch */ - seconds -= ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); + epoch_diff_seconds = ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); #ifdef HAVE_INT64_TIMESTAMP - result = seconds * USECS_PER_SEC; + result = microseconds - (epoch_diff_seconds * USECS_PER_SEC); #else - result = seconds; + result = seconds - epoch_diff_seconds; #endif /* Recheck in case roundoff produces something just out of range */