aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/date.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2003-06-16 18:56:45 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2003-06-16 18:56:45 +0000
commit3467b1a1f9417cc941c51584104b61fa78aa6b5a (patch)
tree5c775a4a65b9976016604d22921ba244102ffddd /src/backend/utils/adt/date.c
parent76924b5d94dce15cd3169a57f43b2468897f4329 (diff)
downloadpostgresql-3467b1a1f9417cc941c51584104b61fa78aa6b5a.tar.gz
postgresql-3467b1a1f9417cc941c51584104b61fa78aa6b5a.zip
Fix bugs in interval-to-time conversion: HAVE_INT64_TIMESTAMP case did not
work at all, and neither case behaved sanely for negative intervals.
Diffstat (limited to 'src/backend/utils/adt/date.c')
-rw-r--r--src/backend/utils/adt/date.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index bd9653d0fa6..fa03b577891 100644
--- a/src/backend/utils/adt/date.c
+++ b/src/backend/utils/adt/date.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.82 2003/05/12 23:08:50 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.83 2003/06/16 18:56:45 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1066,6 +1066,11 @@ time_interval(PG_FUNCTION_ARGS)
/* interval_time()
* Convert interval to time data type.
+ *
+ * This is defined as producing the fractional-day portion of the interval.
+ * Therefore, we can just ignore the months field. It is not real clear
+ * what to do with negative intervals, but we choose to subtract the floor,
+ * so that, say, '-2 hours' becomes '22:00:00'.
*/
Datum
interval_time(PG_FUNCTION_ARGS)
@@ -1074,15 +1079,23 @@ interval_time(PG_FUNCTION_ARGS)
TimeADT result;
#ifdef HAVE_INT64_TIMESTAMP
+ int64 days;
+
result = span->time;
- if ((result >= INT64CONST(86400000000))
- || (result <= INT64CONST(-86400000000)))
- result -= (result / INT64CONST(1000000) * INT64CONST(1000000));
+ if (result >= INT64CONST(86400000000))
+ {
+ days = result / INT64CONST(86400000000);
+ result -= days * INT64CONST(86400000000);
+ }
+ else if (result < 0)
+ {
+ days = (-result + INT64CONST(86400000000-1)) / INT64CONST(86400000000);
+ result += days * INT64CONST(86400000000);
+ }
#else
- Interval span1;
-
result = span->time;
- TMODULO(result, span1.time, 86400e0);
+ if (result >= 86400e0 || result < 0)
+ result -= floor(result / 86400e0) * 86400e0;
#endif
PG_RETURN_TIMEADT(result);