aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/date.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/date.c')
-rw-r--r--src/backend/utils/adt/date.c114
1 files changed, 111 insertions, 3 deletions
diff --git a/src/backend/utils/adt/date.c b/src/backend/utils/adt/date.c
index d7f4da718bf..9ccbaa1f488 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.52 2000/11/11 19:55:19 thomas Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/date.c,v 1.53 2000/12/03 14:51:01 thomas Exp $
*
*-------------------------------------------------------------------------
*/
@@ -594,7 +594,6 @@ timestamp_time(PG_FUNCTION_ARGS)
PG_RETURN_TIMEADT(result);
}
-
/* datetime_timestamp()
* Convert date and time to timestamp data type.
*/
@@ -612,7 +611,6 @@ datetime_timestamp(PG_FUNCTION_ARGS)
PG_RETURN_TIMESTAMP(result);
}
-
/* time_interval()
* Convert time to interval data type.
*/
@@ -630,6 +628,72 @@ time_interval(PG_FUNCTION_ARGS)
PG_RETURN_INTERVAL_P(result);
}
+/* interval_time()
+ * Convert interval to time data type.
+ */
+Datum
+interval_time(PG_FUNCTION_ARGS)
+{
+ Interval *span = PG_GETARG_INTERVAL_P(0);
+ TimeADT result;
+ Interval span1;
+
+ result = span->time;
+ TMODULO(result, span1.time, 86400e0);
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* time_pl_interval()
+ * Add interval to time.
+ */
+Datum
+time_pl_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeADT result;
+ TimeADT time1;
+
+ result = (time + span->time);
+ TMODULO(result, time1, 86400e0);
+ if (result < 0)
+ result += 86400;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* time_mi_interval()
+ * Subtract interval from time.
+ */
+Datum
+time_mi_interval(PG_FUNCTION_ARGS)
+{
+ TimeADT time = PG_GETARG_TIMEADT(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeADT result;
+ TimeADT time1;
+
+ result = (time - span->time);
+ TMODULO(result, time1, 86400e0);
+ if (result < 0)
+ result += 86400;
+
+ PG_RETURN_TIMEADT(result);
+}
+
+/* interval_pl_time()
+ * Add time to interval.
+ */
+Datum
+interval_pl_time(PG_FUNCTION_ARGS)
+{
+ Datum span = PG_GETARG_DATUM(0);
+ Datum time = PG_GETARG_DATUM(1);
+
+ return DirectFunctionCall2(time_pl_interval, time, span);
+}
+
/* time_text()
* Convert time to text data type.
@@ -856,6 +920,50 @@ timetz_smaller(PG_FUNCTION_ARGS)
PG_RETURN_TIMETZADT_P(time2);
}
+/* timetz_pl_interval()
+ * Add interval to timetz.
+ */
+Datum
+timetz_pl_interval(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeTzADT *result;
+ TimeTzADT time1;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = (time->time + span->time);
+ TMODULO(result->time, time1.time, 86400e0);
+ if (result->time < 0)
+ result->time += 86400;
+ result->zone = time->zone;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
+/* timetz_mi_interval()
+ * Subtract interval from timetz.
+ */
+Datum
+timetz_mi_interval(PG_FUNCTION_ARGS)
+{
+ TimeTzADT *time = PG_GETARG_TIMETZADT_P(0);
+ Interval *span = PG_GETARG_INTERVAL_P(1);
+ TimeTzADT *result;
+ TimeTzADT time1;
+
+ result = (TimeTzADT *) palloc(sizeof(TimeTzADT));
+
+ result->time = (time->time - span->time);
+ TMODULO(result->time, time1.time, 86400e0);
+ if (result->time < 0)
+ result->time += 86400;
+ result->zone = time->zone;
+
+ PG_RETURN_TIMETZADT_P(result);
+}
+
/* overlaps_timetz()
* Implements the SQL92 OVERLAPS operator.
* Algorithm from Date and Darwen, 1997